﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using DevExpress.Web.ASPxGridView;
using DevExpress.Web.ASPxEditors;
using DevExpress.Web;
using SGT_ON;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web.Security;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.IO;
using DevExpress.Web.ASPxUploadControl;
using Aspose.Cells;
using System.Net.Mime;
using System.Globalization;

public static class ResponseHelper
{
    public static void Redirect(this HttpResponse response,
        string url,
        string target,
        string windowFeatures)
    {

        if ((String.IsNullOrEmpty(target) ||
            target.Equals("_self", StringComparison.OrdinalIgnoreCase)) &&
            String.IsNullOrEmpty(windowFeatures))
        {

            response.Redirect(url);
        }
        else
        {
            Page page = (Page)HttpContext.Current.Handler;
            if (page == null)
            {
                throw new InvalidOperationException(
                    "Cannot redirect to new window outside Page context.");
            }
            url = page.ResolveClientUrl(url);

            string script;
            if (!String.IsNullOrEmpty(windowFeatures))
            {
                script = @"window.open(""{0}"", ""{1}"", ""{2}"");";
            }
            else
            {
                script = @"window.open(""{0}"", ""{1}"");";
            }

            script = String.Format(script, url, target, windowFeatures);
            ScriptManager.RegisterStartupScript(page,
                typeof(Page),
                "Redirect",
                script,
                true);
        }
    }
}

public partial class Presupuesto : System.Web.UI.Page
{   
    /// <summary>
    /// Devuelve el presupuesto activo. Si no hay uno activo, es NULL
    /// </summary>
    protected ONPresupuesto PresupuestoActivo
    {
        get
        {
            int _id;
            int.TryParse(Request.QueryString["ID"], out _id);
            if (_id <= 0)
                return null;
            else
                return ONPresupuesto.CrearPresupuesto(_id);
        }
    }
    /// <summary>
    /// Devuelve un usuario vacio si no se encuentra uno.
    /// </summary>
    private ONEmpleado EmpleadoActivo
    {
        get
        {
            return ONEmpleado.ObtenerEmpleadoPorUsuarioID(HttpContext.Current.User.Identity.Name);
        }
    }

    #region Metodos creados a mano
    private int _idRecienInsertado;
    private ONElementoColeccion ElementosColumna1
    {
        get
        {
            ONElementoColeccion _resultado = (ONElementoColeccion)Session["Columna1"];

            if (_resultado == null)
                _resultado = new ONElementoColeccion();

            return _resultado;
        }
        set
        {
            Session["Columna1"] = value;
        }
    }
    protected void HabilitarPorID()
    {   


        //Si no tengo ID, inhabilito para que se puedan subir fotos.
        if (Request.QueryString["ID"] == null)
        {
            //boton para insertar items, activo o inactivo cdo hay un presupuesto almacenado
            btnInsertarItem.Enabled = false;
            btnInsertarItem.ToolTip = "Debe almacenar el presupuesto para poder dar de alta ";

            //fotos, inhabilitar la carga
            ((ASPxUploadControl)fvPresupuesto.FindControl("UploadControl")).Enabled = false;
            ((System.Web.UI.WebControls.Label)fvPresupuesto.FindControl("FotosMensaje")).Visible = true;
            ((ASPxHyperLink)fvPresupuesto.FindControl("linkVerFotos")).Enabled = false;
            ((ASPxHyperLink)fvPresupuesto.FindControl("hlCrearDuplicado")).Enabled = false;
        }
        else
        {
            //boton para insertar items, activo o inactivo cdo hay un presupuesto almacenado
            btnInsertarItem.Enabled = true;
            btnInsertarItem.ToolTip = "";

            //fotos, inhabilitar la carga
            ((ASPxUploadControl)fvPresupuesto.FindControl("UploadControl")).Enabled = true;
            ((System.Web.UI.WebControls.Label)fvPresupuesto.FindControl("FotosMensaje")).Visible = false;
            ((ASPxHyperLink)fvPresupuesto.FindControl("linkVerFotos")).Enabled = true;

            // habilito el boton de crear duplicado
            ((ASPxHyperLink)fvPresupuesto.FindControl("hlCrearDuplicado")).Enabled = true;
            ((ASPxHyperLink)fvPresupuesto.FindControl("hlCrearDuplicado")).NavigateUrl = "Presupuesto.aspx?DID=" + Request.QueryString["ID"];
        }

    }

    #region Metodos para almacenar los cambios
    /// <summary>
    /// almacena los cambios encontrados en las grillas (3). Utiliza el ID del presupuseto para actualizar en caso de que se de alta.
    /// </summary>
    private void AlmacenarDetalleDePresupuesto(int pIdPresupuesto)
    {
        //Actualizo los datos de la columna 1 
        ONElementoColeccion _elementosDeGrilla1 = ObtenerElementosDeGrilla(Columna1);
        ONElementoColeccion _elementosDeGrilla2 = ObtenerElementosDeGrilla(Columna2);
        ONElementoColeccion _elementosDeGrilla3 = ObtenerElementosDeGrilla(Columna3);
        ONElementoColeccion _elementosDeGrilla4 = ObtenerElementosDeGrilla(Columna4);

        ActualizarElementosModificados(_elementosDeGrilla1, Columna1, pIdPresupuesto);
        ActualizarElementosModificados(_elementosDeGrilla2, Columna2, pIdPresupuesto);
        ActualizarElementosModificados(_elementosDeGrilla3, Columna3, pIdPresupuesto);
        ActualizarElementosModificados(_elementosDeGrilla4, Columna4, pIdPresupuesto);
    }
    protected void ActualizarElementosModificados(ONElementoColeccion pElementosDeGrilla, ASPxGridView pGrilla, int pIdPresupuesto)
    {
        int start = pGrilla.PageIndex * pGrilla.SettingsPager.PageSize;
        ONElemento _elementoDS;
        ONElementoColeccion _elementosAActualizar = new ONElementoColeccion();
        int _request;

        pGrilla.ClearSort();
        int end = pGrilla.VisibleRowCount;

        for (int i = start; i < end; i++)
        {
            _elementoDS = (ONElemento)pGrilla.GetRow(i);
            foreach (ONElemento _ele in pElementosDeGrilla)
                if (_elementoDS.ID == _ele.ID)
                {

                    if ((int.TryParse(Request.QueryString["ID"], out _request) == false)
                        || (_request < 1))
                    {// hay que insertar todos los elementos por que es nuevo el presupuesto
                        _elementoDS.Reacondicionar = _ele.Reacondicionar;
                        _elementoDS.Controlar = _ele.Controlar;
                        _elementoDS.Pintar = _ele.Pintar;
                        _elementoDS.Reponer = _ele.Reponer;
                        _elementoDS.SacarColocar = _ele.SacarColocar;
                        _elementoDS.Item = _ele.Item;
                        _elementoDS.ReacondicionarCantidad = _ele.ReacondicionarCantidad;
                        _elementoDS.PintarCantidad = _ele.PintarCantidad;
                        _elementoDS.ReponerCantidad = _ele.ReponerCantidad;
                        _elementoDS.IdPresupuesto = pIdPresupuesto;
                        _elementoDS.Insertar();
                    }
                    else
                    {// signiica que el elemento existia y ha sido modificado.
                        if ((_elementoDS.Reponer != _ele.Reponer)
                            || (_elementoDS.Reacondicionar != _ele.Reacondicionar)
                            || (_elementoDS.SacarColocar != _ele.SacarColocar)
                            || (_elementoDS.Controlar != _ele.Controlar)
                            || (_elementoDS.Pintar != _ele.Pintar)
                            || (_elementoDS.PintarCantidad != _ele.PintarCantidad)
                            || (_elementoDS.ReponerCantidad != _ele.ReponerCantidad)
                            || (_elementoDS.ReacondicionarCantidad != _ele.ReacondicionarCantidad)
                            || (_elementoDS.Item != _ele.Item))
                        { //el objeto ha cambiado, lo actualizo    
                            _elementoDS.Reacondicionar = _ele.Reacondicionar;
                            _elementoDS.SacarColocar = _ele.SacarColocar;
                            _elementoDS.Controlar = _ele.Controlar;
                            _elementoDS.Pintar = _ele.Pintar;
                            _elementoDS.Reponer = _ele.Reponer;
                            _elementoDS.Item = _ele.Item;
                            _elementoDS.ReacondicionarCantidad = _ele.ReacondicionarCantidad;
                            _elementoDS.PintarCantidad = _ele.PintarCantidad;
                            _elementoDS.ReponerCantidad = _ele.ReponerCantidad;
                            _elementoDS.IdPresupuesto = pIdPresupuesto;

                            _elementoDS.Actualizar();
                        }
                    }
                }

        }
    }
    protected ONElementoColeccion ObtenerElementosDeGrilla(ASPxGridView pGrilla)
    {
        ONElementoColeccion _elementosDeGrilla = new ONElementoColeccion();
        ONElemento _elemento;

        int start = pGrilla.PageIndex * pGrilla.SettingsPager.PageSize;
        int end = pGrilla.VisibleRowCount;
        GridViewDataColumn _Reponer = pGrilla.Columns["N"] as GridViewDataColumn;
        GridViewDataColumn _Reacondicionar = pGrilla.Columns["R"] as GridViewDataColumn;
        GridViewDataColumn _SacarColocar = pGrilla.Columns["S"] as GridViewDataColumn;
        GridViewDataColumn _Controlar = pGrilla.Columns["C"] as GridViewDataColumn;
        GridViewDataColumn _Pintar = pGrilla.Columns["P"] as GridViewDataColumn;
        GridViewDataColumn _Item = pGrilla.Columns["Item"] as GridViewDataColumn;
        GridViewDataColumn _PanoCantidad = pGrilla.Columns["Paños"] as GridViewDataColumn;
        GridViewDataColumn _ReacondicionarCantidad = pGrilla.Columns["Reac."] as GridViewDataColumn;
        GridViewDataColumn _RepuestoCantidad = pGrilla.Columns["Repuesto"] as GridViewDataColumn;

        for (int i = start; i < end; i++)
        {
            ////////////////////////////////////////////////////////
            //Valores en la grilla
            System.Web.UI.WebControls.CheckBox chkReponer = (System.Web.UI.WebControls.CheckBox)pGrilla.FindRowCellTemplateControl(i, _Reponer, "chkReponer");
            System.Web.UI.WebControls.CheckBox chkReacondicionar = (System.Web.UI.WebControls.CheckBox)pGrilla.FindRowCellTemplateControl(i, _Reacondicionar, "chkReacondicionar");
            System.Web.UI.WebControls.CheckBox chkSacarColocar = (System.Web.UI.WebControls.CheckBox)pGrilla.FindRowCellTemplateControl(i, _SacarColocar, "chkSacarColocar");
            System.Web.UI.WebControls.CheckBox chkControlar = (System.Web.UI.WebControls.CheckBox)pGrilla.FindRowCellTemplateControl(i, _Controlar, "chkControlar");
            System.Web.UI.WebControls.CheckBox chkPintar = (System.Web.UI.WebControls.CheckBox)pGrilla.FindRowCellTemplateControl(i, _Pintar, "chkPintar");
            System.Web.UI.WebControls.TextBox txtItem = (System.Web.UI.WebControls.TextBox)pGrilla.FindRowCellTemplateControl(i, _Item, "txtItem");
            System.Web.UI.WebControls.TextBox txtPanoCantidad = (System.Web.UI.WebControls.TextBox)pGrilla.FindRowCellTemplateControl(i, _PanoCantidad, "txtPanoCantidad");
            System.Web.UI.WebControls.TextBox txtReacondicionarCantidad = (System.Web.UI.WebControls.TextBox)pGrilla.FindRowCellTemplateControl(i, _ReacondicionarCantidad, "txtReacondicionarCantidad");
            System.Web.UI.WebControls.TextBox txtRepuestoCantidad = (System.Web.UI.WebControls.TextBox)pGrilla.FindRowCellTemplateControl(i, _RepuestoCantidad, "txtRepuestoCantidad");

            //esto es para evitar los encabezados de grupos.
            if (chkReponer == null || chkReacondicionar == null || chkControlar == null || chkPintar == null)
                continue;

            int id = Convert.ToInt32(pGrilla.GetRowValues(i, pGrilla.KeyFieldName));

            _elemento = new ONElemento();
            _elemento.Reponer = chkReponer.Checked;
            _elemento.Reacondicionar = chkReacondicionar.Checked;
            _elemento.SacarColocar = chkSacarColocar.Checked;
            _elemento.Controlar = chkControlar.Checked;
            _elemento.Pintar = chkPintar.Checked;
            _elemento.Item = txtItem.Text;

            decimal _cantidadDecimal;
            int _cantidadEntero;
            // Canntidad de paño, convierte automaticamente de . a , si es necesario.
            _cantidadDecimal = Utilidades.ConvertirADecimal(txtPanoCantidad.Text);
            _elemento.PintarCantidad = _cantidadDecimal;

            //cantidad de reacondicionar
            int.TryParse(txtReacondicionarCantidad.Text, out _cantidadEntero); //si falla lo pone en 0
            _elemento.ReacondicionarCantidad = _cantidadEntero;

            //cantidad de Repuesto
            _cantidadDecimal = Utilidades.ConvertirADecimal(txtRepuestoCantidad.Text);
            _elemento.ReponerCantidad = _cantidadDecimal;

            _elemento.ID = id;
            _elementosDeGrilla.Add(_elemento);
            //Fin obtener valores de la grilla
            //////////////////////////////////////////////////////////////
        }
        return _elementosDeGrilla;
    }
    /// <summary>
    /// Devuelve todos los elementos de las tres grillas juntos.
    /// </summary>
    /// <returns></returns>
    protected ONElementoColeccion ObtenerElementosDeTodasLasGrillas()
    {
        //Obtengo elementos de Grilla 1
        ONElementoColeccion _resultado = ObtenerElementosDeGrilla(Columna1);

        //Obtengo elementos de Grilla 2
        ONElementoColeccion _aux = ObtenerElementosDeGrilla(Columna2);
        foreach (ONElemento _elemento in _aux)
            _resultado.Add(_elemento);

        //Obtengo elementos de Grilla 3
        _aux = ObtenerElementosDeGrilla(Columna3);
        foreach (ONElemento _elemento in _aux)
            _resultado.Add(_elemento);

        //Obtengo elementos de Grilla 4
        _aux = ObtenerElementosDeGrilla(Columna4);
        foreach (ONElemento _elemento in _aux)
            _resultado.Add(_elemento);

        return _resultado;
    }
    /// <summary>
    /// Almacena la información de los datos de resumen del presupuesto. Detecta cuando es un alta o una modificación.
    /// </summary>
    private int AlmacenarResumenDePresupuesto()
    {
        //Verifico si el costo original de chaperia es 0, si lo es, calculo el costo y sigo con la actualización de los datos en la base de datos.
        System.Web.UI.WebControls.TextBox _pinturaOriginalText = (System.Web.UI.WebControls.TextBox)fvPresupuesto.FindControl("PinturaOriginalText");
        if (_pinturaOriginalText.Text == "")
            RecalcularCostoDePintura();

        int _idPresupuesto = -1;
        string _idPresupuestoQuery = Request.QueryString["ID"];
        if ((int.TryParse(_idPresupuestoQuery, out _idPresupuesto) == false)
            || (_idPresupuesto < 1))
        {//si es falso tengo que darlo de alta
            fvPresupuesto.ChangeMode(FormViewMode.Insert);
            fvPresupuesto.InsertItem(true);
            if (_idRecienInsertado < 1)
                throw new ArgumentException("Error al insertar el presupuesto.");
            _idPresupuesto = _idRecienInsertado;
        }
        else
        {//es verdadero y lo tengo que modificar
            fvPresupuesto.UpdateItem(true);
        }

        return _idPresupuesto;
    }
    /// <summary>
    /// Devuelve el ID del presupuesto agregado
    /// </summary>
    /// <returns></returns>
    protected int GuardarPresupuesto()
    {
        int _idPresupuesto = AlmacenarResumenDePresupuesto();
        AlmacenarDetalleDePresupuesto(_idPresupuesto);
        return _idPresupuesto;
    }
    #endregion

    #region Recalculo de costo de Pintura, Porcentajes y Repuestos
    private void RecalcularCostoDePintura()
    {
        ////////////////////////////////////////////////
        // Obtengo el costo del paño.
        System.Web.UI.WebControls.TextBox _CostoPanoText = (System.Web.UI.WebControls.TextBox)fvPresupuesto.FindControl("CostoPanoText");
        if(_CostoPanoText == null)
            throw new ArgumentException("El objeto CostoPanoText, no se encontró");

        decimal _costoDePano = decimal.Zero;
        _costoDePano = Utilidades.ConvertirADecimal(_CostoPanoText.Text);
        // Fin costo de paño.
        ////////////////////////////////////////////////

        // obtengo todos los elementos de la pantalla.
        ONElementoColeccion _elementos = ObtenerElementosDeTodasLasGrillas();

        // Calculo el valor del costo de pintura.
        decimal _total = _elementos.CalcularCostoPintura(_costoDePano);

        /////////////////////////////////////////////
        //Pongo el valor en el campo correspondiente.
        System.Web.UI.WebControls.TextBox _PinturaOriginalText = (System.Web.UI.WebControls.TextBox)fvPresupuesto.FindControl("PinturaOriginalText");
        if (_PinturaOriginalText == null)
            throw new ArgumentException("El objeto PinturaOriginalText, no se encontró");

        _PinturaOriginalText.Text = _total.ToString(ONPresupuesto._formatoDeDinero);
        //Fin poner el valor en el campo correspondiente.
        /////////////////////////////////////////////
    }
    private void RecalcularCostoDeRepuestos()
    {
        // obtengo todos los elementos de la pantalla.
        ONElementoColeccion _elementos = ObtenerElementosDeTodasLasGrillas();

        // Calculo el valor del costo de los repuestos.
        decimal _total = _elementos.CalcularCostoDeRepuestos();

        /////////////////////////////////////////////
        //Pongo el valor en el campo correspondiente.
        System.Web.UI.WebControls.TextBox _RepuestoText = (System.Web.UI.WebControls.TextBox)fvPresupuesto.FindControl("RepuestosOriginal");
        if (_RepuestoText == null)
            throw new ArgumentException("El objeto RepuestosOriginal, no se encontró");

        _RepuestoText.Text = _total.ToString(ONPresupuesto._formatoDeDinero);
        //Fin poner el valor en el campo correspondiente.
        /////////////////////////////////////////////
    }
    private void RecalcularPorcentaje(string pNombreTextboxParaResultado, string pNombreTextBoxPorcentaje)
    {
        ////////////////////////////////////////////////
        // Obtengo los valores de los controles
        System.Web.UI.WebControls.TextBox _TextboxParaResultado = (System.Web.UI.WebControls.TextBox)fvPresupuesto.FindControl(pNombreTextboxParaResultado); //"CostoPanoText"
        System.Web.UI.WebControls.TextBox _TextBoxPorcentaje = (System.Web.UI.WebControls.TextBox)fvPresupuesto.FindControl(pNombreTextBoxPorcentaje); 
        if ((_TextboxParaResultado == null) || (_TextBoxPorcentaje == null))
            throw new ArgumentException("El objeto " + pNombreTextboxParaResultado + " o " + pNombreTextBoxPorcentaje + ", no se encontró");

        decimal _valorActual = Utilidades.ConvertirADecimal(_TextboxParaResultado.Text);

        decimal _porcentaje = Utilidades.ConvertirADecimal(_TextBoxPorcentaje.Text);
        // Fin obtener valores de los controles
        ////////////////////////////////////////////////
                
        // Calculo el valor del valor nuevo.
        decimal _total = _valorActual * (1 + (_porcentaje / 100));

        /////////////////////////////////////////////
        //Pongo el valor en el campo correspondiente.        
        _TextboxParaResultado.Text = _total.ToString(ONPresupuesto._formatoDeDinero);
        //Fin poner el valor en el campo correspondiente.
        /////////////////////////////////////////////
    }
    #endregion
    /// <summary>
    /// Elimina las fotos del presupuesto.
    /// </summary>
    /// <param name="pID"></param>
    protected void EliminarFotosDelPresupuesto(int pID)
    {
        string _carpeta = MapPath("~/Fotos") + "\\" + pID.ToString();

        if (Directory.Exists(_carpeta) == true)
            Directory.Delete(_carpeta, true);
    }
    /// <summary>
    /// Crea el elemento con los datos listos para insertar en la base de datos.
    /// </summary>
    /// <returns></returns>
    protected ONElemento CrearElementoParaInsertar(int pIdPresupuesto)
    {
        ONElemento _resultado = new ONElemento();

        int _idPresupuesto;
        if (int.TryParse(Request.QueryString["ID"], out _idPresupuesto) == false)
            return null;

        _resultado.IdPresupuesto = pIdPresupuesto;
        _resultado.Item = txtItemNuevo.Text;
        _resultado.Reponer = chkN.Checked;
        _resultado.Reacondicionar = chkR.Checked;
        _resultado.SacarColocar = chkS.Checked;
        _resultado.Controlar = chkC.Checked;
        _resultado.Pintar = chkP.Checked;
        _resultado.ReponerCantidadString = txtRepuestoInsertar.Text;
        _resultado.ReacondicionarCantidadString = txtReacondicionarInsertar.Text;
        _resultado.PintarCantidadString = txtPanosInsertar.Text;

        _resultado.Grupo = "     Elementos agregados";
        _resultado.SubGrupo = "";
        _resultado.Columna = 11;

        return _resultado;

    }
    #endregion
    
    
    protected void Page_Load(object sender, EventArgs e)
    {   
        //Por si tengo que hacer un duplicado
        VerificarSiEsDuplicado();

        HabilitarPorID();

        MostrarMensajePresupuestoGuardado();//si corresponde

        //CargarProductosAsociados();
    }
    //protected override void OnLoadComplete(EventArgs e)
    //{
    //    // do your stuff here

        

    //    //VerificarSiHayQueExportarPresupuesto();

    //    // call the base method so the page life-cycle will continue
    //    base.OnLoadComplete(e);
    //}
    private void VerificarSiHayQueExportarPresupuesto()
    {
        int _id;
        int.TryParse(Request.QueryString["ID"], out _id);

        if ((Request.QueryString["ExpPre"] != null)
            && (Request.QueryString["ExpPre"] == "Si"))
        {//tengo que exportarlo
            GenerarReporteDePresupuesto(_id);
        }
        else if ((Request.QueryString["ExpOT"] != null)
            && (Request.QueryString["ExpOT"] == "Si"))
        {
            GenerarOrdenDeTrabajo(_id);
        }
    }
    //private void CargarProductosAsociados()
    //{
    //    int _id;
    //    int.TryParse(Request.QueryString["ID"], out _id);
    //    if (gvProductosAsociados.DataSource == null)
    //    {
    //        StockProductoEnPresupuestoColeccion _productosAsociados = StockProductoEnPresupuesto.ObtenerProductosDePresupuesto(_id);
    //        gvProductosAsociados.DataSource = _productosAsociados;
    //    }
    //}   
    protected void VerificarSiEsDuplicado()
    {
        int _presupuestoID;
        if ((Request.QueryString["DID"] == null)
                || (int.TryParse(Request.QueryString["DID"], out _presupuestoID) == false)
                || (int.Parse(Request.QueryString["DID"]) <= 0))
            return;
        
        _presupuestoID = int.Parse(Request.QueryString["DID"]);

        ONPresupuesto _presupuesto = ONPresupuesto.CrearDuplicado(ONPresupuesto.CrearPresupuesto(_presupuestoID));
        string _destino = "Presupuesto.aspx?ID=" + _presupuesto.ID.ToString();

        Response.Redirect(_destino);
    }
    protected void MostrarMensajePresupuestoGuardado()
    {
        string _mensaje = Request.QueryString["M"];
        if (_mensaje != null)
            if(_mensaje == "1")
                MostrarMensaje("El presupuesto ha sido almacenado correctamente", System.Drawing.Color.Green);
             else if (_mensaje == "2")
            MostrarMensaje("El estado ha sido modificado", System.Drawing.Color.Green);
    }
    protected void LinkButton2_Click(object sender, EventArgs e)
    {
        fvPresupuesto.ChangeMode(FormViewMode.Edit);
    }
    protected void btnGuardar_Click(object sender, EventArgs e)
    {

        int _idPresupuesto = GuardarPresupuesto();
        Response.Redirect("Presupuesto.aspx?ID=" + _idPresupuesto.ToString() + "&M=1");
    }
    protected void MostrarMensaje(string pTexto, System.Drawing.Color pColor)
    {
        if ((pTexto == null)
            || (pTexto == ""))
        {
            lblMensaje.Visible = false;
            lblMensaje.Text = "";
        }

        lblMensaje.Text = pTexto;
        lblMensaje.Visible = true;
        lblMensaje.ForeColor = pColor;
    }
    protected void dsAlarmas_Inserting(object sender, ObjectDataSourceMethodEventArgs e)
    {
        ONPresupuestoAlarma _presupuestoAlarma = (ONPresupuestoAlarma)e.InputParameters[0];
        int _id;
        if (int.TryParse(Request.QueryString["ID"], out _id) == false)
        {
            e.Cancel = true;
            throw new ArgumentException("Debe guardar el presupuesto para poder agregar alarmas.");
        }
        _presupuestoAlarma.IdPresupuesto = int.Parse(Request.QueryString["ID"]);
    }
    protected void dsAlarmas_Updating(object sender, ObjectDataSourceMethodEventArgs e)
    {
        ONPresupuestoAlarma _presupuestoAlarma = (ONPresupuestoAlarma)e.InputParameters[0];
        int _id;
        if (int.TryParse(Request.QueryString["ID"], out _id) == false)
        {
            e.Cancel = true;
            throw new ArgumentException("Debe guardar el presupuesto para poder agregar alarmas.");
        }
        _presupuestoAlarma.IdPresupuesto = int.Parse(Request.QueryString["ID"]);
    }
    protected void btnRecalcularAutorizadoTotal_Click(object sender, EventArgs e)
    {
        decimal _total = CalcularSubTotal(Calculo.Autorizado);
        decimal _aux;

        //pongo el valor en el subtotal
        System.Web.UI.WebControls.Label _label = (System.Web.UI.WebControls.Label)fvPresupuesto.FindControl("lblAutorizadoSubtotal");
        if (_total > 0)
            _label.Text = _total.ToString(ONPresupuesto._formatoDeDinero);
        else
            _label.Text = "";

        //pongo el valor en el del iva
        _label = (System.Web.UI.WebControls.Label)fvPresupuesto.FindControl("lblIVAAutorizado");
        System.Web.UI.WebControls.TextBox _text = (System.Web.UI.WebControls.TextBox)fvPresupuesto.FindControl("IVAText");
        _aux = Utilidades.ConvertirADecimal(_text.Text);
        if ((_total > 0) && (_text.Text != "") && (_aux > decimal.Zero))
            _label.Text = (_total * (_aux / 100)).ToString(ONPresupuesto._formatoDeDinero);
        else
            _label.Text = "";

        //_text = (System.Web.UI.WebControls.TextBox)fvPresupuesto.FindControl("IVAText");
        //decimal.TryParse(_text.Text, out _aux);
        _total = _total * (1 + (_aux / 100));



        _text = (System.Web.UI.WebControls.TextBox)fvPresupuesto.FindControl("TotalAutorizadoText");
        _text.Text = _total.ToString(ONPresupuesto._formatoDeDinero);
    }
    protected void btnRecalcularTotalOriginal_Click(object sender, EventArgs e)
    {

        decimal _total = CalcularSubTotal(Calculo.Original);
        decimal _aux;        

        //pongo el valor en el subtotal
        System.Web.UI.WebControls.Label _label = (System.Web.UI.WebControls.Label)fvPresupuesto.FindControl("lblOriginalSubtotal");
        if(_total > 0)
            _label.Text = _total.ToString(ONPresupuesto._formatoDeDinero);
        else
            _label.Text = "";

        //pongo el valor en el del iva
        _label = (System.Web.UI.WebControls.Label)fvPresupuesto.FindControl("lblIVAOriginal");
        System.Web.UI.WebControls.TextBox _text = (System.Web.UI.WebControls.TextBox)fvPresupuesto.FindControl("IVAText");
        _aux = Utilidades.ConvertirADecimal(_text.Text);
        if ((_total > 0) && (_text.Text != "") && (_aux > decimal.Zero))
            _label.Text = (_total * (_aux / 100)).ToString(ONPresupuesto._formatoDeDinero);
        else
            _label.Text = "";

        //_text = (System.Web.UI.WebControls.TextBox)fvPresupuesto.FindControl("IVAText");
        //decimal.TryParse(_text.Text, out _aux);
        _total = _total * (1 + (_aux/100));

        

        _text = (System.Web.UI.WebControls.TextBox)fvPresupuesto.FindControl("TotalOriginalText");
        _text.Text = _total.ToString(ONPresupuesto._formatoDeDinero);
    }
    private enum Calculo
    {
        Autorizado,
        Original
    }
    private decimal CalcularSubTotal(Calculo pCalculo)
    {        
        string _valor = pCalculo.ToString();

        System.Web.UI.WebControls.TextBox _text;
        decimal _total = decimal.Zero;
        decimal _aux;

        _text = (System.Web.UI.WebControls.TextBox)fvPresupuesto.FindControl("Chaperia" + _valor + "Text");
        _aux = Utilidades.ConvertirADecimal(_text.Text);
        _total = _total + _aux;

        _text = (System.Web.UI.WebControls.TextBox)fvPresupuesto.FindControl("Pintura" + _valor + "Text");
        _aux = Utilidades.ConvertirADecimal(_text.Text);
        _total = _total + _aux;

        _text = (System.Web.UI.WebControls.TextBox)fvPresupuesto.FindControl("Lustre" + _valor + "Text");
        _aux = Utilidades.ConvertirADecimal(_text.Text);
        _total = _total + _aux;

        _text = (System.Web.UI.WebControls.TextBox)fvPresupuesto.FindControl("Encerado" + _valor + "Text");
        _aux = Utilidades.ConvertirADecimal(_text.Text);
        _total = _total + _aux;

        _text = (System.Web.UI.WebControls.TextBox)fvPresupuesto.FindControl("Armado" + _valor);
        _aux = Utilidades.ConvertirADecimal(_text.Text);
        _total = _total + _aux;

        _text = (System.Web.UI.WebControls.TextBox)fvPresupuesto.FindControl("Desarmado" + _valor);
        _aux = Utilidades.ConvertirADecimal(_text.Text);
        _total = _total + _aux;

        _text = (System.Web.UI.WebControls.TextBox)fvPresupuesto.FindControl("DespegadoYPegadoDeMoldurasEInsignias" + _valor);
        _aux = Utilidades.ConvertirADecimal(_text.Text);
        _total = _total + _aux;

        _text = (System.Web.UI.WebControls.TextBox)fvPresupuesto.FindControl("ReparacionPlasticos" + _valor);
        _aux = Utilidades.ConvertirADecimal(_text.Text);
        _total = _total + _aux;

        _text = (System.Web.UI.WebControls.TextBox)fvPresupuesto.FindControl("DespegadoYPegadoDeCristales" + _valor);
        _aux = Utilidades.ConvertirADecimal(_text.Text);
        _total = _total + _aux;

        _text = (System.Web.UI.WebControls.TextBox)fvPresupuesto.FindControl("Mecanica" + _valor);
        _aux = Utilidades.ConvertirADecimal(_text.Text);
        _total = _total + _aux;

        _text = (System.Web.UI.WebControls.TextBox)fvPresupuesto.FindControl("MecanicaTrenDelantero" + _valor);
        _aux = Utilidades.ConvertirADecimal(_text.Text);
        _total = _total + _aux;

        _text = (System.Web.UI.WebControls.TextBox)fvPresupuesto.FindControl("AireAcondicionado" + _valor);
        _aux = Utilidades.ConvertirADecimal(_text.Text);
        _total = _total + _aux;

        _text = (System.Web.UI.WebControls.TextBox)fvPresupuesto.FindControl("Tapiceria" + _valor);
        _aux = Utilidades.ConvertirADecimal(_text.Text);
        _total = _total + _aux;

        _text = (System.Web.UI.WebControls.TextBox)fvPresupuesto.FindControl("Cerrajeria" + _valor);
        _aux = Utilidades.ConvertirADecimal(_text.Text);
        _total = _total + _aux;

        _text = (System.Web.UI.WebControls.TextBox)fvPresupuesto.FindControl("Electricidad" + _valor);
        _aux = Utilidades.ConvertirADecimal(_text.Text);
        _total = _total + _aux;

        _text = (System.Web.UI.WebControls.TextBox)fvPresupuesto.FindControl("Electronica" + _valor);
        _aux = Utilidades.ConvertirADecimal(_text.Text);
        _total = _total + _aux;

        _text = (System.Web.UI.WebControls.TextBox)fvPresupuesto.FindControl("Repuestos" + _valor);
        _aux = Utilidades.ConvertirADecimal(_text.Text);
        _total = _total + _aux;

        _text = (System.Web.UI.WebControls.TextBox)fvPresupuesto.FindControl("Otros" + _valor);
        _aux = Utilidades.ConvertirADecimal(_text.Text);
        _total = _total + _aux;
        
        ///////////////////////
        //Calculo la facturacion con franquicia
        string _facturacion = "";
        ASPxRadioButtonList _rbl = (ASPxRadioButtonList)fvPresupuesto.FindControl("rbFacturacion");
        if (_rbl.SelectedItem != null)
            _facturacion = ((ASPxRadioButtonList)fvPresupuesto.FindControl("rbFacturacion")).SelectedItem.Value.ToString();

        _text = (System.Web.UI.WebControls.TextBox)fvPresupuesto.FindControl("txtFranquicia" + _valor);
        _aux = Utilidades.ConvertirADecimal(_text.Text);
        _total = ONPresupuesto.CalcularSubTotalConFranquicia(_total, _aux, _facturacion);
        // Fin calculo franquicia con facturacion
        //////////////////////

        //_total = _total + _aux;
        

        return _total;
    }
    protected void btnEliminar_Click(object sender, EventArgs e)
    {
        int _id;
        if (int.TryParse(Request.QueryString["ID"], out _id) == false)
            throw new ArgumentException("No hay un presupuesto seleccionado.");

        ONPresupuesto.Eliminar(_id);

        EliminarFotosDelPresupuesto(_id);

        Session["Mensaje"] = "El presupuesto ha sido eliminado";
        Response.Redirect("Mensaje.aspx");

    }
    
    protected void btnInsertarItem_Click(object sender, EventArgs e)
    {
        System.Web.UI.WebControls.TextBox _patenteTb = (System.Web.UI.WebControls.TextBox)fvPresupuesto.FindControl("PatenteTextBox");
        System.Web.UI.WebControls.TextBox _apellioTb = (System.Web.UI.WebControls.TextBox)fvPresupuesto.FindControl("ApellidoTextBox");
        
        if (_patenteTb.Text == "")
            _patenteTb.Text = " ";

        if (_apellioTb.Text == "")
            _apellioTb.Text = " ";

        int _idPresupuesto;
        //if (int.TryParse(Request.QueryString["ID"], out _idPresupuesto) == false)
        _idPresupuesto = GuardarPresupuesto(); // siempre lo tengo que guardar por si han tocado algo antes.

        ONElemento _elemento = CrearElementoParaInsertar(_idPresupuesto);
        _elemento.Insertar();

        //Columna1.DataBind();
        Response.Redirect("Presupuesto.aspx?ID=" + _idPresupuesto.ToString());  
    }    
    protected void dsPresupuesto_Inserted(object sender, ObjectDataSourceStatusEventArgs e)
    {
        _idRecienInsertado = -1;
        ONPresupuesto _presupuesto = (ONPresupuesto)e.ReturnValue;
        if (_presupuesto != null)
            _idRecienInsertado = _presupuesto.ID;
    }
    protected void uplImage_FileUploadComplete(object sender, DevExpress.Web.ASPxUploadControl.FileUploadCompleteEventArgs e)
    {
        e.CallbackData = SavePostedFile(e.UploadedFile);
    }
    protected string SavePostedFile(UploadedFile uploadedFile)
    {
        string ret = "";
        if (uploadedFile.IsValid)
        {
            //string tempFileName = MapPath(UploadDirectory) + Path.GetRandomFileName();
            //string fileName = "ThumbnailImage.jpg";
            //string resFileName = MapPath(UploadDirectory) + fileName;
            //uploadedFile.SaveAs(tempFileName);

            //PhotoUtils.CreateThumbnailFile(tempFileName, ThumbnailSize, resFileName);

            //File.Delete(tempFileName);
            //ret = fileName;
            string _ruta = ObtenerRutaPorID();
            ret = _ruta + "\\" + uploadedFile.FileName.Replace(" ", "_"); ;//reemplazo espacios por guiones bajos            
            uploadedFile.SaveAs(ret);


        }
        return ret;
    }
    /// <summary>
    /// Devuelve la ruta del presupuesto.
    /// Si el directorio no existe, lo crea.
    /// </summary>
    private string ObtenerRutaPorID()
    {
        string _carpeta = MapPath("~/Fotos") + "\\" + Request.QueryString["ID"];
        //Directory.GetCurrentDirectory()
        if (Directory.Exists(_carpeta) == false)
            Directory.CreateDirectory(_carpeta);
        //Directory.Delete(directoryString);

        return _carpeta;
    }

    const string UploadDirectory = "~/Fotos/";
   
    protected void RecalcularPorcentaje_Click(object sender, ImageClickEventArgs e)
    {
        // Para que esto funcione los nombres de los controles deben estar bien si o si con el formato que se muestra abajo.
        string _nombre = ((ImageButton)sender).ID;
        _nombre = _nombre.Replace("btnRecalcular", ""); //le quito el boton

        string _nombreTextBoxParaResultado = _nombre + "Original"; //formato q tienen que tener los nombres de los controles
        string _nombreTextBoxPorcentaje = "txt" + _nombre + "Porcentaje"; //formato q tienen que tener los nombres de los controles

        RecalcularPorcentaje(_nombreTextBoxParaResultado, _nombreTextBoxPorcentaje);
    }
    protected void dsPresupuesto_Updating(object sender, ObjectDataSourceMethodEventArgs e)
    {
        AsignarValoresDePantallaAObjeto(e);
        
    }
    protected void dsPresupuesto_Inserting(object sender, ObjectDataSourceMethodEventArgs e)
    {
        AsignarValoresDePantallaAObjeto(e);
    }
    /// <summary>
    /// Los parametros no se pueden usar correctamente por que el databind dentro de un UpdatePanel no funciona cuando esta dentro de un formview
    /// Por eso todo lo que esta dentro del UpdatePanel tiene que meterse a mano.
    /// </summary>
    /// <param name="e"></param>
    protected void AsignarValoresDePantallaAObjeto(ObjectDataSourceMethodEventArgs e)
    {
        //Agregado esto por que los databind dentro de los updatepanels no andan
        ONPresupuesto _presupuesto = (ONPresupuesto)e.InputParameters[0];
        
        //los porcentajes
        _presupuesto.ReparacionPlasticosPorcentajeString = ((System.Web.UI.WebControls.TextBox)fvPresupuesto.FindControl("txtReparacionPlasticosPorcentaje")).Text;
        _presupuesto.DespegadoYPegadoDeCristalesPorcentajeString = ((System.Web.UI.WebControls.TextBox)fvPresupuesto.FindControl("txtDespegadoYPegadoDeCristalesPorcentaje")).Text;
        _presupuesto.MecanicaPorcentajeString = ((System.Web.UI.WebControls.TextBox)fvPresupuesto.FindControl("txtMecanicaPorcentaje")).Text;
        _presupuesto.MecanicaTrenDelanteroPorcentajeString = ((System.Web.UI.WebControls.TextBox)fvPresupuesto.FindControl("txtMecanicaTrenDelanteroPorcentaje")).Text;
        _presupuesto.AireAcondicionadoPorcentajeString = ((System.Web.UI.WebControls.TextBox)fvPresupuesto.FindControl("txtAireAcondicionadoPorcentaje")).Text;
        _presupuesto.TapiceriaPorcentajeString = ((System.Web.UI.WebControls.TextBox)fvPresupuesto.FindControl("txtTapiceriaPorcentaje")).Text;
        _presupuesto.CerrajeriaPorcentajeString = ((System.Web.UI.WebControls.TextBox)fvPresupuesto.FindControl("txtCerrajeriaPorcentaje")).Text;
        _presupuesto.ElectricidadPorcentajeString = ((System.Web.UI.WebControls.TextBox)fvPresupuesto.FindControl("txtElectricidadPorcentaje")).Text;
        _presupuesto.RepuestosPorcentajeString = ((System.Web.UI.WebControls.TextBox)fvPresupuesto.FindControl("txtRepuestosPorcentaje")).Text;
        _presupuesto.ElectronicaPorcentajeString = ((System.Web.UI.WebControls.TextBox)fvPresupuesto.FindControl("txtElectronicaPorcentaje")).Text;

        _presupuesto.CostoDePanoString = ((System.Web.UI.WebControls.TextBox)fvPresupuesto.FindControl("CostoPanoText")).Text;
        _presupuesto.ChaperiaOriginalString = ((System.Web.UI.WebControls.TextBox)fvPresupuesto.FindControl("ChaperiaOriginalText")).Text;
        _presupuesto.AireAcondicionadoAutorizadoString = ((System.Web.UI.WebControls.TextBox)fvPresupuesto.FindControl("AireAcondicionadoAutorizado")).Text;
        _presupuesto.AireAcondicionadoOriginalString = ((System.Web.UI.WebControls.TextBox)fvPresupuesto.FindControl("AireAcondicionadoOriginal")).Text;
        _presupuesto.CerrajeriaAutorizadoString = ((System.Web.UI.WebControls.TextBox)fvPresupuesto.FindControl("CerrajeriaAutorizado")).Text;
        _presupuesto.CerrajeriaOriginalString = ((System.Web.UI.WebControls.TextBox)fvPresupuesto.FindControl("CerrajeriaOriginal")).Text;
        _presupuesto.ChaperiaAutorizadoString = ((System.Web.UI.WebControls.TextBox)fvPresupuesto.FindControl("ChaperiaAutorizadoText")).Text;
        _presupuesto.ChaperiaOriginalString = ((System.Web.UI.WebControls.TextBox)fvPresupuesto.FindControl("ChaperiaOriginalText")).Text;
        _presupuesto.DespegadoYPegadoDeCristalesOriginalString = ((System.Web.UI.WebControls.TextBox)fvPresupuesto.FindControl("DespegadoYPegadoDeCristalesOriginal")).Text;
        _presupuesto.DespegadoYPegadoDeCristalesAutorizadoString = ((System.Web.UI.WebControls.TextBox)fvPresupuesto.FindControl("DespegadoYPegadoDeCristalesAutorizado")).Text;
        _presupuesto.ElectricidadOriginalString = ((System.Web.UI.WebControls.TextBox)fvPresupuesto.FindControl("ElectricidadOriginal")).Text;
        _presupuesto.ElectricidadAutorizadoString = ((System.Web.UI.WebControls.TextBox)fvPresupuesto.FindControl("ElectricidadAutorizado")).Text;
        _presupuesto.EnceradoAutorizadoString = ((System.Web.UI.WebControls.TextBox)fvPresupuesto.FindControl("EnceradoAutorizadoText")).Text;
        _presupuesto.EnceradoOriginalString = ((System.Web.UI.WebControls.TextBox)fvPresupuesto.FindControl("EnceradoOriginalText")).Text;
        _presupuesto.MecanicaAutorizadoString = ((System.Web.UI.WebControls.TextBox)fvPresupuesto.FindControl("MecanicaAutorizado")).Text;
        _presupuesto.MecanicaOriginalString = ((System.Web.UI.WebControls.TextBox)fvPresupuesto.FindControl("MecanicaOriginal")).Text;
        _presupuesto.MecanicaTrenDelanteroAutorizadoString = ((System.Web.UI.WebControls.TextBox)fvPresupuesto.FindControl("MecanicaTrenDelanteroAutorizado")).Text;
        _presupuesto.MecanicaTrenDelanteroOriginalString = ((System.Web.UI.WebControls.TextBox)fvPresupuesto.FindControl("MecanicaTrenDelanteroOriginal")).Text;
        _presupuesto.PinturaOriginalString = ((System.Web.UI.WebControls.TextBox)fvPresupuesto.FindControl("PinturaOriginalText")).Text;
        _presupuesto.PinturaAutorizadoString = ((System.Web.UI.WebControls.TextBox)fvPresupuesto.FindControl("PinturaAutorizadoText")).Text;
        _presupuesto.ReparacionPlasticosOriginalString = ((System.Web.UI.WebControls.TextBox)fvPresupuesto.FindControl("ReparacionPlasticosOriginal")).Text;
        _presupuesto.ReparacionPlasticosAutorizadoString = ((System.Web.UI.WebControls.TextBox)fvPresupuesto.FindControl("ReparacionPlasticosAutorizado")).Text;
        _presupuesto.RepuestosOriginalString = ((System.Web.UI.WebControls.TextBox)fvPresupuesto.FindControl("RepuestosOriginal")).Text;
        _presupuesto.RepuestosAutorizadoString = ((System.Web.UI.WebControls.TextBox)fvPresupuesto.FindControl("RepuestosAutorizado")).Text;
        _presupuesto.TapiceriaOriginalString = ((System.Web.UI.WebControls.TextBox)fvPresupuesto.FindControl("TapiceriaOriginal")).Text;
        _presupuesto.TapiceriaAutorizadoString = ((System.Web.UI.WebControls.TextBox)fvPresupuesto.FindControl("TapiceriaAutorizado")).Text;
        _presupuesto.LustreOriginalString = ((System.Web.UI.WebControls.TextBox)fvPresupuesto.FindControl("LustreOriginalText")).Text;
        _presupuesto.LustreAutorizadoString = ((System.Web.UI.WebControls.TextBox)fvPresupuesto.FindControl("LustreAutorizadoText")).Text;
        _presupuesto.ArmadoOriginalString = ((System.Web.UI.WebControls.TextBox)fvPresupuesto.FindControl("ArmadoOriginal")).Text;
        _presupuesto.ArmadoAutorizadoString = ((System.Web.UI.WebControls.TextBox)fvPresupuesto.FindControl("ArmadoAutorizado")).Text;
        _presupuesto.DesarmadoOriginalString = ((System.Web.UI.WebControls.TextBox)fvPresupuesto.FindControl("DesarmadoOriginal")).Text;
        _presupuesto.DesarmadoAutorizadoString = ((System.Web.UI.WebControls.TextBox)fvPresupuesto.FindControl("DesarmadoAutorizado")).Text;
        _presupuesto.ElectronicaOriginalString = ((System.Web.UI.WebControls.TextBox)fvPresupuesto.FindControl("ElectronicaOriginal")).Text;
        _presupuesto.ElectronicaAutorizadoString = ((System.Web.UI.WebControls.TextBox)fvPresupuesto.FindControl("ElectronicaAutorizado")).Text;
        _presupuesto.TotalAutorizadoString = ((System.Web.UI.WebControls.TextBox)fvPresupuesto.FindControl("TotalAutorizadoText")).Text;
        _presupuesto.TotalOriginalString = ((System.Web.UI.WebControls.TextBox)fvPresupuesto.FindControl("TotalOriginalText")).Text;
        _presupuesto.IVAString = ((System.Web.UI.WebControls.TextBox)fvPresupuesto.FindControl("IVAText")).Text;

        _presupuesto.OtrosOriginalString = ((System.Web.UI.WebControls.TextBox)fvPresupuesto.FindControl("OtrosOriginal")).Text;
        _presupuesto.OtrosAutorizadoString = ((System.Web.UI.WebControls.TextBox)fvPresupuesto.FindControl("OtrosAutorizado")).Text;

        _presupuesto.RepuestosACargoDeLaCompaniaDeSeguros = ((System.Web.UI.WebControls.CheckBox)fvPresupuesto.FindControl("RepuestosACargoDeLaCompaniaDeSegurosCheckBox")).Checked; ;
        _presupuesto.DespegadoYPegadoDeMoldurasEInsigniasAutorizadoString = ((System.Web.UI.WebControls.TextBox)fvPresupuesto.FindControl("DespegadoYPegadoDeMoldurasEInsigniasAutorizado")).Text; ;
        _presupuesto.DespegadoYPegadoDeMoldurasEInsigniasOriginalString = ((System.Web.UI.WebControls.TextBox)fvPresupuesto.FindControl("DespegadoYPegadoDeMoldurasEInsigniasOriginal")).Text; ;

        _presupuesto.FacturaRepuestos = ((System.Web.UI.WebControls.TextBox)fvPresupuesto.FindControl("txtFacturaRepuestos")).Text;
        _presupuesto.FacturaDeVenta = ((System.Web.UI.WebControls.TextBox)fvPresupuesto.FindControl("txtFacturaDeVenta")).Text;
        _presupuesto.FranquiciaAutorizadoString = ((System.Web.UI.WebControls.TextBox)fvPresupuesto.FindControl("txtFranquiciaAutorizado")).Text;
        _presupuesto.FranquiciaOriginalString = ((System.Web.UI.WebControls.TextBox)fvPresupuesto.FindControl("txtFranquiciaOriginal")).Text;
        _presupuesto.Estado = ((System.Web.UI.WebControls.HiddenField)fvPresupuesto.FindControl("hfEstado")).Value;

        _presupuesto.UsuarioResponsableId = EmpleadoActivo.ID;

        //id del presupuesto asociado
        int _poId;
        int.TryParse(((System.Web.UI.WebControls.HiddenField)fvPresupuesto.FindControl("hfPresupuestoOriginal")).Value,out _poId);
        if (_poId == 0)
            _poId = -1;
        _presupuesto.PresupuestoOriginalId =  _poId;
        
        _presupuesto.TipoFacturacion = "";        
        ASPxRadioButtonList _rbl = (ASPxRadioButtonList)fvPresupuesto.FindControl("rbFacturacion");
        if(_rbl.SelectedItem != null)
            _presupuesto.TipoFacturacion = ((ASPxRadioButtonList)fvPresupuesto.FindControl("rbFacturacion")).SelectedItem.Value.ToString();

        _presupuesto.CreadoPor = ONEmpleado.ObtenerEmpleadoPorUsuarioID(User.Identity.Name).ApellidoYNombre;
        _presupuesto.UltimaModificacionPor = _presupuesto.CreadoPor;
    }
    protected void btnGenerarReporte_Click(object sender, EventArgs e)
    {
        //verifico si el presupuesto esta en estado Borrador, si esta en estado borrador, tengo que pasarlo a "Presupuesto" y exportarlo
        int _id;
        int.TryParse(Request.QueryString["ID"], out _id);
        if (_id <= 0)
        {
            MostrarMensaje("Presupuesto no válido, debe guardar antes", System.Drawing.Color.Red);
            return;
        }
        else
        {
            ONPresupuesto _presupuesto = ONPresupuesto.CrearPresupuesto(_id);
            if(_presupuesto.Estado == ONPresupuesto.enuEstados.Borrador.ToString()) //verifico si esta en estado Borrador para modificarlo y mandarlo a imprimir.
            {
                _presupuesto.Estado = ONPresupuesto.enuEstados.Presupuesto.ToString();
                _presupuesto.Actualizar();
                string _ruta = HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority) + HttpRuntime.AppDomainAppVirtualPath;
                Response.Redirect(_ruta + "/Presupuesto.aspx?ID=" + _id.ToString() + "&ExpPre=Si");
                return;
            }
        }
        GenerarReporteDePresupuesto(_id);
    }
    protected void btnImprimir_Click(object sender, EventArgs e)
    {
        int _id;
        int.TryParse(Request.QueryString["ID"], out _id);
        GenerarReporteDePresupuesto(_id);
    }
    protected void btnRecalcularCostoDeRepuestos_Command(object sender, CommandEventArgs e)
    {
        RecalcularCostoDeRepuestos();
    }
    protected void btnExportarOrdenDeTrabajo_Click(object sender, EventArgs e)
    {
        if (ValidarParaExportarOT() == false)
            return;
        
        //verifico si el presupuesto esta en estado Borrador, si esta en estado borrador, tengo que pasarlo a "Presupuesto" y exportarlo
        int _id;
        int.TryParse(Request.QueryString["ID"], out _id);
        if (_id <= 0)
        {
            MostrarMensaje("Presupuesto no válido, debe guardar antes", System.Drawing.Color.Red);
            return;
        }
        else
        {
            ONPresupuesto _presupuesto = ONPresupuesto.CrearPresupuesto(_id);
            if ((_presupuesto.Estado == ONPresupuesto.enuEstados.Borrador.ToString()) //verifico si esta en estado Borrador para modificarlo y mandarlo a imprimir.
                || (_presupuesto.Estado == ONPresupuesto.enuEstados.Presupuesto.ToString())
                || (_presupuesto.Estado == ONPresupuesto.enuEstados.Cerrado.ToString()))
            {
                GuardarPresupuesto();
                /////////////////////////////////////////////////////////////////////////////////////
                ONPresupuesto _presupuestoCopiado = ONPresupuesto.CrearDuplicadoCompleto(_presupuesto);

                //hago la asociación del presupuesto al original (que seria la copia, se hace asi por las fotos)
                _presupuesto = ONPresupuesto.CrearPresupuesto(_id); //lo tengo que volver a cargar x q al hacer el duplicado, lo pisa
                _presupuesto.Estado = ONPresupuesto.enuEstados.Reparación.ToString();
                _presupuesto.PresupuestoOriginalId = _presupuestoCopiado.ID;
                _presupuesto.Actualizar();

                //busco los presupuestos que tengan la misma patente y la misma fecha de creación y los pongo en estado cerrado.
                ONPresupuestoColeccion _presupuestos = ONPresupuesto.ObtenerPor(_presupuesto.FechaHoraCreacion.Date.ToString(), _presupuesto.FechaHoraCreacion.Date.AddDays(1).AddSeconds(-1).ToString(), _presupuesto.Patente, "Todos");
                if (_presupuestos != null)
                {
                    foreach (ONPresupuesto _presu in _presupuestos)
                    {
                        //verifico que tenga la misma patente
                        if ((_presu.Patente == _presupuesto.Patente)
                            && (_presu.Aseguradora.ID == _presupuesto.Aseguradora.ID)
                            && (_presu.ID != _id))//que no sea el presupuesto que paso al estado Reparaciòn
                        {
                            _presu.Estado = ONPresupuesto.enuEstados.Cerrado.ToString();
                            _presu.Actualizar();
                        }
                    }
                }
                ////////////////////////////////////////////////////////////////////////////////////
                
                string _ruta = HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority) + HttpRuntime.AppDomainAppVirtualPath; //esta linea es completa agregada
                Response.Redirect(_ruta + "/Presupuesto.aspx?ID=" + _id.ToString() + "&ExpOT=Si");
                return;
            }
        }
       
        GenerarOrdenDeTrabajo(_id);

        //le cambio el estado a "en reparcion", para hacerlo, simulo un clic en el boton Reparacion .
        //CambiarEstado((ASPxButton)fvPresupuesto.FindControl("btnEnReparacion"), null);

    }
    protected void btnImprimirOrdenDeTrabajo_Click(object sender, EventArgs e)
    {
        int _id;
        int.TryParse(Request.QueryString["ID"], out _id);
        GenerarOrdenDeTrabajo(_id);
    }
    protected void btnRecalcularPinturaOriginal_Click(object sender, ImageClickEventArgs e)
    {
        RecalcularCostoDePintura();
    }
    protected void btnExportarRepuestos_Click(object sender, EventArgs e)
    {
        int _id;
        int.TryParse(Request.QueryString["ID"], out _id);
        GenerarReporteDeRepuestos(_id);
    }

    #region Metodos generados a mano

    protected void GenerarReporteDeRepuestos(int pId)
    {
        if (pId < 1)
            return;

        //Obtengo el presupuesto
        ONPresupuesto _presupuesto = ONPresupuesto.CrearPresupuesto(pId);
        if (_presupuesto == null)
            throw new ArgumentException("El presupuesto no se encontró");

        //Abro el archivo plantilla
        //Instantiate a new workbook
        Workbook workbook = new Workbook();
        //Open template
        string path = System.Web.HttpContext.Current.Server.MapPath("~");
        //path = path.Substring(0, path.LastIndexOf("\\"));
        path += Parametros.RutaPlantillaRepuestos;
        //path += @"\SGT-Presentacion\PlantillasDeReportes\Presupuesto.xls";

        workbook.Open(path);

        //Get the first worksheet in the workbook
        Worksheet worksheet = workbook.Worksheets[0];

        //Get the cells collection in the sheet
        Cells cells = worksheet.Cells;

        #region Encabezado
        //Datos de encabezado
        cells[_NombreReporteRepuestos].PutValue(_presupuesto.ApellidoYNombre);
        cells[_TelCelReporteRepuestos].PutValue(_presupuesto.AnoVehiculo);
        cells[_AseguradoraReporteRepuestos].PutValue(_presupuesto.Aseguradora.RazonSocial);
        cells[_VehiculoReporteRepuestos].PutValue(_presupuesto.Marca);
        cells[_ModeloReporteRepuestos].PutValue(_presupuesto.Modelo);
        cells[_PatenteReporteRepuestos].PutValue(_presupuesto.Patente);
        
        #endregion

        #region Carga de elementos
        int x = _ColumnaPrimeraColumna;
        int y = _FilaPrimeraFila;

        //obtengo el porcentaje del detalle para aplicar a cada elemento
        decimal _coeficiente = _presupuesto.RepuestosPorcentaje;
        _coeficiente = 1 + _coeficiente / 100;


        ONElementoColeccion _elementos = _presupuesto.ElementosAReemplazar;
        if (_elementos.Count > 0)
        {
            decimal _subtotal = decimal.Zero;
            foreach (ONElemento _elemento in _elementos)
            {
                if (_elemento.Reponer == true)
                {
                    //uno las celdas hasta antes del total
                    cells.Merge(y , x , 1 , 17);
                    cells[y, x].Style.HorizontalAlignment = TextAlignmentType.Left;

                    cells[y, x].Style.Custom = ";;;@*.";                    
                    cells[y, x].PutValue(_elemento.ItemParaReporte);
                    if((_elemento.ReponerCantidad * _coeficiente) > decimal.Zero)
                        cells[y, _ColumnaDeRepuestosTotal].PutValue((_elemento.ReponerCantidad * _coeficiente).ToString(Parametros.FormatoDinero));
                    y = y + 1;

                    _subtotal = _subtotal + _elemento.ReponerCantidad;
                }
            }
            
            // pongo el total
            y = y + 2;
            cells[y, _ColumnaDeRepuestosTotal - 3].PutValue("Total");
            cells[y, _ColumnaDeRepuestosTotal - 3].Style.HorizontalAlignment = TextAlignmentType.Right;
            cells[y, _ColumnaDeRepuestosTotal - 3].Style.Font.IsBold = true;
            
            cells[y, _ColumnaDeRepuestosTotal].PutValue(_presupuesto.RepuestosOriginalString);// _subtotal.ToString(Parametros.FormatoDinero));
            cells[y, _ColumnaDeRepuestosTotal].Style.Font.IsBold = true;
            cells[y, _ColumnaDeRepuestosTotal].Style.Font.Size = cells[y, _ColumnaDeRepuestosTotal - 2].Style.Font.Size + 1;            
        }        

        #endregion
                
        //workbook.Save(_presupuesto.Patente + " - " + _presupuesto.Marca + " - " + _presupuesto.Apellido + "-REP.xls", FileFormatType.Default, SaveType.OpenInExcel, System.Web.HttpContext.Current.Response);
        string pNombreArchivo = _presupuesto.Patente + "-" + _presupuesto.Modelo + "-" + _presupuesto.Apellido + "-REP.xls";
        pNombreArchivo = pNombreArchivo.Replace(char.Parse("/"), char.Parse("-")).Replace(char.Parse("\\"), char.Parse("-"));
        pNombreArchivo = pNombreArchivo.Replace(" ", "");
        pNombreArchivo = pNombreArchivo.Replace("--", "-");
        workbook.Save(this.Request.PhysicalApplicationPath + "Archivos\\" + pNombreArchivo);
        workbook = null;

        string _ruta = HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority) + HttpRuntime.AppDomainAppVirtualPath; //esta linea es completa agregada
        //Response.Redirect(this.Request.ApplicationPath + "/Archivos/" + pNombreArchivo);  
        Response.Redirect(_ruta + "/Archivos/" + pNombreArchivo);  
    }
    protected void GenerarOrdenDeTrabajo(int pId)
    {
        if (pId < 1)
            return;

        //Obtengo el presupuesto
        ONPresupuesto _presupuesto = ONPresupuesto.CrearPresupuesto(pId);
        if (_presupuesto == null)
            throw new ArgumentException("El presupuesto no se encontró");

        //Abro el archivo plantilla
        //Instantiate a new workbook
        Workbook workbook = new Workbook();
        //Open template
        string path = System.Web.HttpContext.Current.Server.MapPath("~");
        path += Parametros.RutaPlantillaOrdenDeTrabajo;

        workbook.Open(path);

        //Get the first worksheet in the workbook
        Worksheet worksheet = workbook.Worksheets[0];

        //Get the cells collection in the sheet
        Cells cells = worksheet.Cells;

        #region Encabezado
        //Datos de encabezado
        cells[_PatenteOT].PutValue(_presupuesto.Patente);
        cells[_MarcaOT].PutValue(_presupuesto.Marca);
        cells[_AnoOT].PutValue(_presupuesto.AnoVehiculo);

        //Pongo el dia en el formato Miercoles 20/05/2008
        CultureInfo ci = new CultureInfo("Es-Es");
        if (_presupuesto.FechaEntregaEstimadaString != "") //si hay un valor en la fecha, lo pongo
        {
            string _dia = (ci.DateTimeFormat.GetDayName(_presupuesto.FechaEntregaEstimada.Value.DayOfWeek));
            _dia = _dia.Substring(0, 1).ToUpper() + _dia.Substring(1);
            cells[_FechaentregaOT].PutValue(_dia + " " + _presupuesto.FechaEntregaEstimadaString);
            
        }

        cells[_ModeloOT].PutValue(_presupuesto.Modelo);
        cells[_RepuestosOT].PutValue(_presupuesto.ProveedorDeRepuestos);
        
        #endregion

        #region Carga de elementos
        int x = _ColumnaPrimeraColumna;
        int y = _FilaPrimeraFila;

        // Reemplazar
        ONElementoColeccion _elementos = _presupuesto.ElementosAReemplazar;
        if (_elementos.Count > 0)
        {
            cells[y, x].Style.Font.IsBold = true;
            cells[y, x].PutValue("REEMPLAZAR");
            y = y + 1;
            foreach (ONElemento _elemento in _elementos)
            {
                // Si llegue al final, tengo que saltar a la otra columna
                if (y > _FilaUltimaFilaOrdenDeTrabajo)
                {
                    y = _FilaPrimeraFila;
                    x = _ColumnaSegundaColumna;
                }
                //string _cadena = (_elemento.Item + "-" + _elemento.SubGrupo.Trim() + "-" + _elemento.Grupo.Trim()).Replace("--", "-");
                cells[y, x].PutValue(_elemento.ItemParaReporte);
                y = y + 1;
            }
        }

        //Sacar y colocar
        _elementos = _presupuesto.ElementosSacarColocar;
        if (_elementos.Count > 0)
        {
            y = y + 1;
            // Si llegue al final, tengo que saltar a la otra columna
            if (y > _FilaUltimaFilaOrdenDeTrabajo)
            {
                y = _FilaPrimeraFila;
                x = _ColumnaSegundaColumna;
            }
            cells[y, x].Style.Font.IsBold = true;
            cells[y, x].PutValue("SACAR Y COLOCAR");
            y = y + 1;
            foreach (ONElemento _elemento in _elementos)
            {
                //si llene todo, lo paro
                if ((y > _FilaUltimaFilaOrdenDeTrabajo)
                    && (x == _ColumnaSegundaColumna))
                    break;

                // Si llegue al final, tengo que saltar a la otra columna
                if (y > _FilaUltimaFilaOrdenDeTrabajo)
                {
                    y = _FilaPrimeraFila;
                    x = _ColumnaSegundaColumna;
                }

                //string _cadena = (_elemento.Item + "-" + _elemento.SubGrupo.Trim() + "-" + _elemento.Grupo.Trim()).Replace("--", "-");
                cells[y, x].PutValue(_elemento.ItemParaReporte);
                y = y + 1;
            }
        }

        // REPARAR
        _elementos = _presupuesto.ElementosAReparar;
        if (_elementos.Count > 0)
        {
            y = y + 1;
            // Si llegue al final, tengo que saltar a la otra columna
            if (y > _FilaUltimaFilaOrdenDeTrabajo)
            {
                y = _FilaPrimeraFila;
                x = _ColumnaSegundaColumna;
            }
            cells[y, x].Style.Font.IsBold = true;
            cells[y, x].PutValue("REPARAR");
            y = y + 1;
            foreach (ONElemento _elemento in _elementos)
            {
                //si llene todo, lo paro
                if ((y > _FilaUltimaFilaOrdenDeTrabajo)
                    && (x == _ColumnaSegundaColumna))
                    break;

                // Si llegue al final, tengo que saltar a la otra columna
                if (y > _FilaUltimaFilaOrdenDeTrabajo)
                {
                    y = _FilaPrimeraFila;
                    x = _ColumnaSegundaColumna;
                }

                //string _cadena = (_elemento.Item + "-" + _elemento.SubGrupo.Trim() + "-" + _elemento.Grupo.Trim()).Replace("--", "-");
                cells[y, x].PutValue(_elemento.ItemParaReporte);
                y = y + 1;
            }
        }

        // Controlar
        _elementos = _presupuesto.ElementosAControlar;
        if (_elementos.Count > 0)
        {
            y = y + 1;
            // Si llegue al final, tengo que saltar a la otra columna
            if (y > _FilaUltimaFilaOrdenDeTrabajo)
            {
                y = _FilaPrimeraFila;
                x = _ColumnaSegundaColumna;
            }
            cells[y, x].Style.Font.IsBold = true;
            cells[y, x].PutValue("CONTROLAR");
            y = y + 1;
            foreach (ONElemento _elemento in _elementos)
            {
                //si llene todo, lo paro
                if ((y > _FilaUltimaFilaOrdenDeTrabajo)
                    && (x == _ColumnaSegundaColumna))
                    break;

                // Si llegue al final, tengo que saltar a la otra columna
                if (y > _FilaUltimaFilaOrdenDeTrabajo)
                {
                    y = _FilaPrimeraFila;
                    x = _ColumnaSegundaColumna;
                }

                //string _cadena = (_elemento.Item + "-" + _elemento.SubGrupo.Trim() + "-" + _elemento.Grupo.Trim()).Replace("--", "-");
                cells[y, x].PutValue(_elemento.ItemParaReporte);
                y = y + 1;
            }
        }

        _elementos = _presupuesto.ElementosAPintar;
        if (_elementos.Count > 0)
        {
            y = y + 1;
            // Si llegue al final, tengo que saltar a la otra columna
            if (y > _FilaUltimaFila)
            {
                y = _FilaPrimeraFila;
                x = _ColumnaSegundaColumna;
            }
            cells[y, x].Style.Font.IsBold = true;
            cells[y, x].PutValue("PINTAR");
            y = y + 1;
            foreach (ONElemento _elemento in _elementos)
            {
                //si llene todo, lo paro
                if ((y > _FilaUltimaFila)
                    && (x == _ColumnaSegundaColumna))
                    break;

                // Si llegue al final, tengo que saltar a la otra columna
                if (y > _FilaUltimaFila)
                {
                    y = _FilaPrimeraFila;
                    x = _ColumnaSegundaColumna;
                }

                //string _cadena = (_elemento.Item + "-" + _elemento.SubGrupo.Trim() + "-" + _elemento.Grupo.Trim()).Replace("--", "-");
                cells[y, x].PutValue(_elemento.ItemParaReporte);
                y = y + 1;
            }
        }

        #endregion

        //workbook.Save(_presupuesto.Patente + " - " + _presupuesto.Marca + " - " + _presupuesto.Apellido + "-OT.xls", FileFormatType.Default, SaveType.OpenInExcel, System.Web.HttpContext.Current.Response);

        string pNombreArchivo = _presupuesto.Patente + "-" + _presupuesto.Modelo + "-" + _presupuesto.Apellido + "-OT.xls";
        pNombreArchivo = pNombreArchivo.Replace(char.Parse("/"), char.Parse("-")).Replace(char.Parse("\\"), char.Parse("-"));
        pNombreArchivo = pNombreArchivo.Replace(" ", "");
        pNombreArchivo = pNombreArchivo.Replace("--", "-");
        workbook.Save(this.Request.PhysicalApplicationPath + "Archivos\\" + pNombreArchivo);
        workbook = null;

        string _ruta = HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority) + HttpRuntime.AppDomainAppVirtualPath; //esta linea es completa agregada
        //string _destino = this.Request.ApplicationPath + "/Archivos/" + pNombreArchivo; //original
        string _destino = _ruta + "/Archivos/" + pNombreArchivo;
        Response.Redirect(_destino);
    }
    protected string SavePostedFiles(UploadedFile uploadedFile)
    {
        string ret = "";
        if (uploadedFile.IsValid)
        {
            string _ruta = ObtenerRutaPorID();
            ret = _ruta + "\\" + uploadedFile.FileName.Replace(" ", "_"); ;//reemplazo espacios por guiones bajos            
            uploadedFile.SaveAs(ret);

            //FileInfo fileInfo = new FileInfo(uploadedFile.FileName);
            //string resFileName = MapPath(UploadDirectory) + fileInfo.Name;
            //uploadedFile.SaveAs(resFileName);

            //string fileLabel = fileInfo.Name;
            //string fileType = uploadedFile.PostedFile.ContentType.ToString();
            //string fileLength = uploadedFile.PostedFile.ContentLength / 1024 + "K";
            //ret = string.Format("{0} <i>({1})</i> {2}|{3}", fileLabel, fileType, fileLength, fileInfo.Name);
        }
        return ret;
    }
    #region Parametros para Excel de presupuesto.
    #region Presupuesto
    string _NombrePresupuesto = "G8";
    string _TelCelPresupuesto = "G9";
    string _FechaCreadoPresupuesto = "G10";
    string _SeguroPresupuesto = "G11";
    string _MarcaPresupuesto = "P8";
    string _ModeloPresupuesto = "P9";
    string _PatentePresupuesto = "P10";
    string _AnoPresupuesto = "P11";
    #endregion

    #region Orden de trabajo
    string _PatenteOT = "G8";
    string _MarcaOT = "G9";
    string _AnoOT = "G10";
    string _FechaentregaOT = "P8";
    string _ModeloOT = "P9";
    string _RepuestosOT = "P10";
    
    #endregion

    int _ColumnaPrimeraColumna = 4;
    int _ColumnaSegundaColumna = 13;
    int _FilaPrimeraFila = 15;
    int _FilaUltimaFila = 56;
    int _FilaUltimaFilaOrdenDeTrabajo = 69;

    //Para los totales
    int _ColumnaPrimeraColumnaTotales = 10;
    int _ColumnaSegundaColumnaTotales = 20;
    int _FilaUltimaTotales = 67;
    int _FilaPrimeraTotales = 59;
    string _MensajeRepuestosAcargo = "E59";

    string _TotalNumero = "U70";
    string _TotalTexto = "S70";
    //string _TotalImprimirS = "T70";
    string _TotalEnPalabrasExportar = "E71";

    //Del reporte de Repuestos
    int _ColumnaDeRepuestosTotal = 22; //columna P
    string _NombreReporteRepuestos = "F8";
    string _TelCelReporteRepuestos = "F9";
    string _AseguradoraReporteRepuestos = "F10";
    string _VehiculoReporteRepuestos = "P8";
    string _ModeloReporteRepuestos = "P9";
    string _PatenteReporteRepuestos = "P10";

    #endregion
    protected void GenerarReporteDePresupuesto(int pId)
    {
        if (pId < 1)
            return;

        //Obtengo el presupuesto
        ONPresupuesto _presupuesto = ONPresupuesto.CrearPresupuesto(pId);
        if (_presupuesto == null)
            throw new ArgumentException("El presupuesto no se encontró");

        //Abro el archivo plantilla
        //Instantiate a new workbook
        Workbook workbook = new Workbook();
        //Open template
        string path = System.Web.HttpContext.Current.Server.MapPath("~");
        path += Parametros.RutaPlantillaPresupuesto;

        workbook.Open(path);

        //Get the first worksheet in the workbook
        Worksheet worksheet = workbook.Worksheets[0];

        //Get the cells collection in the sheet
        Cells cells = worksheet.Cells;

        // ///////////////////////////////////////
        // Estilos
        Aspose.Cells.Style _EstiloCeldasSubtotales = workbook.Styles[workbook.Styles.Add()];
        _EstiloCeldasSubtotales.HorizontalAlignment = TextAlignmentType.Right;
        //
        // ///////////////////////////////////////

        #region Encabezado
        //Datos de encabezado
        cells[_NombrePresupuesto].PutValue(_presupuesto.ApellidoYNombre);
        cells[_TelCelPresupuesto].PutValue(_presupuesto.CelularTelefono);
        cells[_FechaCreadoPresupuesto].PutValue(_presupuesto.FechaHoraCreacionString);
        cells[_SeguroPresupuesto].PutValue(_presupuesto.Aseguradora.RazonSocial);
        cells[_MarcaPresupuesto].PutValue(_presupuesto.Marca);
        cells[_ModeloPresupuesto].PutValue(_presupuesto.Modelo);
        cells[_PatentePresupuesto].PutValue(_presupuesto.Patente);
        cells[_AnoPresupuesto].PutValue(_presupuesto.AnoVehiculo);
        #endregion

        #region Pie

        int _fila = _FilaUltimaTotales;
        int _col = _ColumnaSegundaColumnaTotales;

        if (_presupuesto.RepuestosACargoDeLaCompaniaDeSeguros == true)
        {
            cells[_MensajeRepuestosAcargo].PutValue("Repuestos a cargo de la compañía aseguradora");
        }

        if (_presupuesto.OtrosOriginal > decimal.Zero)
        {
            cells[_fila, _col].PutValue(_presupuesto.OtrosOriginalString);
            cells[_fila, _col].Style = _EstiloCeldasSubtotales;
            cells[_fila, _col - 2].PutValue("Otros:$");
            cells[_fila, _col - 2].Style.HorizontalAlignment = TextAlignmentType.Right;
            _fila = _fila - 1;
            if (_fila < _FilaPrimeraTotales)
            {//Hago el salto de columna si es necesario.
                _fila = _FilaUltimaTotales;
                _col = _ColumnaPrimeraColumnaTotales;
            }
        }

        if (_presupuesto.RepuestosOriginal > decimal.Zero)
        {
            cells[_fila, _col].PutValue(_presupuesto.RepuestosOriginalString);
            cells[_fila, _col].Style = _EstiloCeldasSubtotales;
            cells[_fila, _col - 2].PutValue("Repuestos:$");
            cells[_fila, _col - 2].Style.HorizontalAlignment = TextAlignmentType.Right;
            _fila = _fila - 1;
            if (_fila < _FilaPrimeraTotales)
            {//Hago el salto de columna si es necesario.
                _fila = _FilaUltimaTotales;
                _col = _ColumnaPrimeraColumnaTotales;
            }
        }

        if (_presupuesto.ElectronicaOriginal > decimal.Zero)
        {
            cells[_fila, _col].PutValue(_presupuesto.ElectronicaOriginalString);
            cells[_fila, _col].Style = _EstiloCeldasSubtotales;
            cells[_fila, _col - 2].PutValue("Electrónica:$");
            cells[_fila, _col - 2].Style.HorizontalAlignment = TextAlignmentType.Right;
            _fila = _fila - 1;
            if (_fila < _FilaPrimeraTotales)
            {//Hago el salto de columna si es necesario.
                _fila = _FilaUltimaTotales;
                _col = _ColumnaPrimeraColumnaTotales;
            }
        }

        if (_presupuesto.ElectricidadOriginal > decimal.Zero)
        {
            cells[_fila, _col].PutValue(_presupuesto.ElectricidadOriginalString);
            cells[_fila, _col].Style = _EstiloCeldasSubtotales;
            cells[_fila, _col - 2].PutValue("Electricidad:$");
            cells[_fila, _col - 2].Style.HorizontalAlignment = TextAlignmentType.Right;
            _fila = _fila - 1;
            if (_fila < _FilaPrimeraTotales)
            {//Hago el salto de columna si es necesario.
                _fila = _FilaUltimaTotales;
                _col = _ColumnaPrimeraColumnaTotales;
            }
        }

        if (_presupuesto.CerrajeriaOriginal > decimal.Zero)
        {
            cells[_fila, _col].PutValue(_presupuesto.CerrajeriaOriginalString);
            cells[_fila, _col].Style = _EstiloCeldasSubtotales;
            cells[_fila, _col - 2].PutValue("Cerrajería:$");
            cells[_fila, _col - 2].Style.HorizontalAlignment = TextAlignmentType.Right;
            _fila = _fila - 1;
            if (_fila < _FilaPrimeraTotales)
            {//Hago el salto de columna si es necesario.
                _fila = _FilaUltimaTotales;
                _col = _ColumnaPrimeraColumnaTotales;
            }
        }

        if (_presupuesto.TapiceriaOriginal > decimal.Zero)
        {
            cells[_fila, _col].PutValue(_presupuesto.TapiceriaOriginalString);
            cells[_fila, _col].Style = _EstiloCeldasSubtotales;
            cells[_fila, _col - 2].PutValue("Tapicería:$");
            cells[_fila, _col - 2].Style.HorizontalAlignment = TextAlignmentType.Right;
            _fila = _fila - 1;
            if (_fila < _FilaPrimeraTotales)
            {//Hago el salto de columna si es necesario.
                _fila = _FilaUltimaTotales;
                _col = _ColumnaPrimeraColumnaTotales;
            }
        }


        if (_presupuesto.AireAcondicionadoOriginal > decimal.Zero)
        {
            cells[_fila, _col].PutValue(_presupuesto.AireAcondicionadoOriginalString);
            cells[_fila, _col].Style = _EstiloCeldasSubtotales;
            cells[_fila, _col - 2].PutValue("Aire acondicionado:$");
            cells[_fila, _col - 2].Style.HorizontalAlignment = TextAlignmentType.Right;
            _fila = _fila - 1;
            if (_fila < _FilaPrimeraTotales)
            {//Hago el salto de columna si es necesario.
                _fila = _FilaUltimaTotales;
                _col = _ColumnaPrimeraColumnaTotales;
            }
        }

        if (_presupuesto.MecanicaTrenDelanteroOriginal > decimal.Zero)
        {
            cells[_fila, _col].PutValue(_presupuesto.MecanicaTrenDelanteroOriginalString);
            cells[_fila, _col].Style = _EstiloCeldasSubtotales;
            cells[_fila, _col - 2].PutValue("Mecanica tren delantero:$");
            cells[_fila, _col - 2].Style.HorizontalAlignment = TextAlignmentType.Right;

            _fila = _fila - 1;
            if (_fila < _FilaPrimeraTotales)
            {//Hago el salto de columna si es necesario.
                _fila = _FilaUltimaTotales;
                _col = _ColumnaPrimeraColumnaTotales;
            }
        }


        if (_presupuesto.MecanicaOriginal > decimal.Zero)
        {
            cells[_fila, _col].PutValue(_presupuesto.MecanicaOriginalString);
            cells[_fila, _col].Style = _EstiloCeldasSubtotales;
            cells[_fila, _col - 2].PutValue("Mecánica:$");
            cells[_fila, _col - 2].Style.HorizontalAlignment = TextAlignmentType.Right;
            _fila = _fila - 1;
            if (_fila < _FilaPrimeraTotales)
            {//Hago el salto de columna si es necesario.
                _fila = _FilaUltimaTotales;
                _col = _ColumnaPrimeraColumnaTotales;
            }
        }

        if (_presupuesto.DespegadoYPegadoDeCristalesOriginal > decimal.Zero)
        {
            cells[_fila, _col].PutValue(_presupuesto.DespegadoYPegadoDeCristalesOriginalString);
            cells[_fila, _col].Style = _EstiloCeldasSubtotales;
            cells[_fila, _col - 2].PutValue("Desp. y pegado cristales:$");
            cells[_fila, _col - 2].Style.HorizontalAlignment = TextAlignmentType.Right;
            _fila = _fila - 1;
            if (_fila < _FilaPrimeraTotales)
            {//Hago el salto de columna si es necesario.
                _fila = _FilaUltimaTotales;
                _col = _ColumnaPrimeraColumnaTotales;
            }
        }

        if (_presupuesto.ReparacionPlasticosOriginal > decimal.Zero)
        {
            cells[_fila, _col].PutValue(_presupuesto.ReparacionPlasticosOriginalString);
            cells[_fila, _col].Style = _EstiloCeldasSubtotales;
            cells[_fila, _col - 2].PutValue("Reparacion plásticos:$");
            cells[_fila, _col - 2].Style.HorizontalAlignment = TextAlignmentType.Right;
            _fila = _fila - 1;
            if (_fila < _FilaPrimeraTotales)
            {//Hago el salto de columna si es necesario.
                _fila = _FilaUltimaTotales;
                _col = _ColumnaPrimeraColumnaTotales;
            }
        }

        if (_presupuesto.DespegadoYPegadoDeMoldurasEInsigniasOriginal > decimal.Zero)
        {
            cells[_fila, _col].PutValue(_presupuesto.DespegadoYPegadoDeMoldurasEInsigniasOriginalString);
            cells[_fila, _col].Style = _EstiloCeldasSubtotales;
            cells[_fila, _col - 2].PutValue("Desp. y peg. molduras:$");
            cells[_fila, _col - 2].Style.HorizontalAlignment = TextAlignmentType.Right;
            _fila = _fila - 1;
            if (_fila < _FilaPrimeraTotales)
            {//Hago el salto de columna si es necesario.
                _fila = _FilaUltimaTotales;
                _col = _ColumnaPrimeraColumnaTotales;
            }
        }

        if (_presupuesto.DesarmadoOriginal > decimal.Zero)
        {
            cells[_fila, _col].PutValue(_presupuesto.DesarmadoOriginalString);
            cells[_fila, _col].Style = _EstiloCeldasSubtotales;
            cells[_fila, _col - 2].PutValue("Desarmado:$");
            cells[_fila, _col - 2].Style.HorizontalAlignment = TextAlignmentType.Right;
            _fila = _fila - 1;
            if (_fila < _FilaPrimeraTotales)
            {//Hago el salto de columna si es necesario.
                _fila = _FilaUltimaTotales;
                _col = _ColumnaPrimeraColumnaTotales;
            }
        }

        if (_presupuesto.ArmadoOriginal > decimal.Zero)
        {
            cells[_fila, _col].PutValue(_presupuesto.ArmadoOriginalString);
            cells[_fila, _col].Style = _EstiloCeldasSubtotales;
            cells[_fila, _col - 2].PutValue("Armado:$");
            cells[_fila, _col - 2].Style.HorizontalAlignment = TextAlignmentType.Right;
            _fila = _fila - 1;
            if (_fila < _FilaPrimeraTotales)
            {//Hago el salto de columna si es necesario.
                _fila = _FilaUltimaTotales;
                _col = _ColumnaPrimeraColumnaTotales;
            }
        }

        if (_presupuesto.EnceradoOriginal > decimal.Zero)
        {
            cells[_fila, _col].PutValue(_presupuesto.EnceradoOriginalString);
            cells[_fila, _col].Style = _EstiloCeldasSubtotales;
            cells[_fila, _col - 2].PutValue("Encerado:$");
            cells[_fila, _col - 2].Style.HorizontalAlignment = TextAlignmentType.Right;
            _fila = _fila - 1;
            if (_fila < _FilaPrimeraTotales)
            {//Hago el salto de columna si es necesario.
                _fila = _FilaUltimaTotales;
                _col = _ColumnaPrimeraColumnaTotales;
            }
        }

        if (_presupuesto.LustreOriginal > decimal.Zero)
        {
            cells[_fila, _col].PutValue(_presupuesto.LustreOriginalString);
            cells[_fila, _col].Style = _EstiloCeldasSubtotales; 
            cells[_fila, _col - 2].PutValue("Lustre:$");
            cells[_fila, _col - 2].Style.HorizontalAlignment = TextAlignmentType.Right;
            _fila = _fila - 1;
            if (_fila < _FilaPrimeraTotales)
            {//Hago el salto de columna si es necesario.
                _fila = _FilaUltimaTotales;
                _col = _ColumnaPrimeraColumnaTotales;
            }
        }

        if (_presupuesto.PinturaOriginal > decimal.Zero)
        {
            cells[_fila, _col].PutValue(_presupuesto.PinturaOriginalString);
            cells[_fila, _col].Style = _EstiloCeldasSubtotales; 
            cells[_fila, _col - 2].PutValue("Pintura:$");
            cells[_fila, _col - 2].Style.HorizontalAlignment = TextAlignmentType.Right;
            _fila = _fila - 1;
            if (_fila < _FilaPrimeraTotales)
            {//Hago el salto de columna si es necesario.
                _fila = _FilaUltimaTotales;
                _col = _ColumnaPrimeraColumnaTotales;
            }
        }

        if (_presupuesto.ChaperiaOriginal > decimal.Zero)
        {
            cells[_fila, _col].PutValue(_presupuesto.ChaperiaOriginalString);
            cells[_fila, _col].Style = _EstiloCeldasSubtotales; 
            cells[_fila, _col - 2].PutValue("Chaperia:$");
            cells[_fila, _col - 2].Style.HorizontalAlignment = TextAlignmentType.Right;
            _fila = _fila - 1;
            if (_fila < _FilaPrimeraTotales)
            {//Hago el salto de columna si es necesario.
                _fila = _FilaUltimaTotales;
                _col = _ColumnaPrimeraColumnaTotales;
            }
        }

        cells[_TotalTexto].PutValue("TOTAL:$");
        cells[_TotalNumero].Style.HorizontalAlignment = TextAlignmentType.Right;
        cells[_TotalNumero].Style.Font.IsBold = true;
        cells[_TotalNumero].PutValue(_presupuesto.TotalOriginalString);
        cells[_TotalEnPalabrasExportar].PutValue("Son pesos: " + _presupuesto.TotalOriginalComoPalabras);
        
        #endregion

        #region Carga de elementos
        int x = _ColumnaPrimeraColumna;
        int y = _FilaPrimeraFila;

        // Agrego todos los que son para reemplazar
        ONElementoColeccion _elementos = _presupuesto.ElementosAReemplazar;
        if (_elementos.Count > 0)
        {
            cells[y, x].Style.Font.IsBold = true;
            cells[y, x].PutValue("REEMPLAZAR");
            y = y + 1;
            foreach (ONElemento _elemento in _elementos)
            {
                // Si llegue al final, tengo que saltar a la otra columna
                if (y > _FilaUltimaFila)
                {
                    y = _FilaPrimeraFila;
                    x = _ColumnaSegundaColumna;
                }                
                cells[y, x].PutValue(_elemento.ItemParaReporte);
                y = y + 1;
            }
        }

        // Sacar y colocar
        _elementos = _presupuesto.ElementosSacarColocar;
        if (_elementos.Count > 0)
        {
            y = y + 1;
            // Si llegue al final, tengo que saltar a la otra columna
            if (y > _FilaUltimaFila)
            {
                y = _FilaPrimeraFila;
                x = _ColumnaSegundaColumna;
            }
            cells[y, x].Style.Font.IsBold = true;
            cells[y, x].PutValue("SACAR Y COLOCAR");
            y = y + 1;
            foreach (ONElemento _elemento in _elementos)
            {
                //si llene todo, lo paro
                if ((y > _FilaUltimaFila)
                    && (x == _ColumnaSegundaColumna))
                    break;

                // Si llegue al final, tengo que saltar a la otra columna
                if (y > _FilaUltimaFila)
                {
                    y = _FilaPrimeraFila;
                    x = _ColumnaSegundaColumna;
                }

                cells[y, x].PutValue(_elemento.ItemParaReporte);
                y = y + 1;
            }
        }

        // Reparar
        _elementos = _presupuesto.ElementosAReparar;
        if (_elementos.Count > 0)
        {
            y = y + 1;
            // Si llegue al final, tengo que saltar a la otra columna
            if (y > _FilaUltimaFila)
            {
                y = _FilaPrimeraFila;
                x = _ColumnaSegundaColumna;
            }
            cells[y, x].Style.Font.IsBold = true;
            cells[y, x].PutValue("REPARAR");
            y = y + 1;
            foreach (ONElemento _elemento in _elementos)
            {
                //si llene todo, lo paro
                if ((y > _FilaUltimaFila)
                    && (x == _ColumnaSegundaColumna))
                    break;

                // Si llegue al final, tengo que saltar a la otra columna
                if (y > _FilaUltimaFila)
                {
                    y = _FilaPrimeraFila;
                    x = _ColumnaSegundaColumna;
                }

                //string _cadena = (_elemento.Item + "-" + _elemento.SubGrupo.Trim() + "-" + _elemento.Grupo.Trim()).Replace("--","-");
                cells[y, x].PutValue(_elemento.ItemParaReporte);
                y = y + 1;
            }
        }

        // Controlar
        _elementos = _presupuesto.ElementosAControlar;
        if (_elementos.Count > 0)
        {
            y = y + 1;
            // Si llegue al final, tengo que saltar a la otra columna
            if (y > _FilaUltimaFila)
            {
                y = _FilaPrimeraFila;
                x = _ColumnaSegundaColumna;
            }
            cells[y, x].Style.Font.IsBold = true;
            cells[y, x].PutValue("CONTROLAR");
            y = y + 1;
            foreach (ONElemento _elemento in _elementos)
            {
                //si llene todo, lo paro
                if ((y > _FilaUltimaFila)
                    && (x == _ColumnaSegundaColumna))
                    break;

                // Si llegue al final, tengo que saltar a la otra columna
                if (y > _FilaUltimaFila)
                {
                    y = _FilaPrimeraFila;
                    x = _ColumnaSegundaColumna;
                }

                //string _cadena = (_elemento.Item + "-" + _elemento.SubGrupo.Trim() + "-" + _elemento.Grupo.Trim()).Replace("--", "-");
                cells[y, x].PutValue(_elemento.ItemParaReporte);
                y = y + 1;
            }
        }

        _elementos = _presupuesto.ElementosAPintar;
        if (_elementos.Count > 0)
        {
            y = y + 1;
            // Si llegue al final, tengo que saltar a la otra columna
            if (y > _FilaUltimaFila)
            {
                y = _FilaPrimeraFila;
                x = _ColumnaSegundaColumna;
            }
            cells[y, x].Style.Font.IsBold = true;
            cells[y, x].PutValue("PINTAR");
            y = y + 1;
            foreach (ONElemento _elemento in _elementos)
            {
                //si llene todo, lo paro
                if ((y > _FilaUltimaFila)
                    && (x == _ColumnaSegundaColumna))
                    break;

                // Si llegue al final, tengo que saltar a la otra columna
                if (y > _FilaUltimaFila)
                {
                    y = _FilaPrimeraFila;
                    x = _ColumnaSegundaColumna;
                }

                //string _cadena = (_elemento.Item + "-" + _elemento.SubGrupo.Trim() + "-" + _elemento.Grupo.Trim()).Replace("--", "-");
                cells[y, x].PutValue(_elemento.ItemParaReporte);
                y = y + 1;
            }
        }

        #endregion

        //Save the excel file
        
        
        string pNombreArchivo = _presupuesto.Patente + "-" + _presupuesto.Modelo + "-" + _presupuesto.Apellido + "-PRE.xls";
        pNombreArchivo = pNombreArchivo.Replace(char.Parse("/"), char.Parse("-")).Replace(char.Parse("\\"), char.Parse("-"));
        pNombreArchivo = pNombreArchivo.Replace(" ", "");
        pNombreArchivo = pNombreArchivo.Replace("--","-");
        workbook.Save(this.Request.PhysicalApplicationPath + "Archivos\\" + pNombreArchivo);
        workbook = null;

        string _ruta = HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority) + HttpRuntime.AppDomainAppVirtualPath; //esta linea es completa agregada
        //string _ruta = this.Request.ApplicationPath + "/Archivos/" + pNombreArchivo; // esta es la original
        _ruta = _ruta + "/Archivos/" + pNombreArchivo;

        //guardo la hora de la ultima generación para que cuando envie el archivo en forma automatica, no lo envie muchas veces seguidas.
        Session["UltimoArchivoEnviadoFechaHora"] = DateTime.Now;
        Response.Redirect(_ruta, false);

        ////Response.ContentType = "image/jpeg";
        ////Response.AppendHeader("Content-Disposition", "attachment; filename=SailBig.jpg");
        ////Response.TransmitFile(Server.MapPath("~/images/sailbig.jpg"));
        //Response.TransmitFile(Server.MapPath(_ruta));
        //Response.Flush();
    }
    
    #endregion
    protected void btnNuevo_Click(object sender, EventArgs e)
    {
        Response.Redirect("Presupuesto.aspx");
    }

    protected void UploadControl_FileUploadComplete(object sender, FileUploadCompleteEventArgs e)
    {
        try
        {
            e.CallbackData = SavePostedFiles(e.UploadedFile);
        }
        catch (Exception ex)
        {
            e.IsValid = false;
            e.ErrorText = ex.Message;
        }
    }
    protected void dsFotos_Selecting1(object sender, ObjectDataSourceSelectingEventArgs e)
    {
        int _id;

        int.TryParse(Request.QueryString["ID"], out _id);
        string _carpeta = Request.PhysicalApplicationPath + "Fotos\\" + _id.ToString();
        e.InputParameters[0] = _id;
        e.InputParameters[1] = _carpeta;
    }
    protected void btnCrearDuplicado_Click(object sender, EventArgs e)
    {
        int _presupuestoID;
        if((Request.QueryString["ID"] == null)
            || (int.TryParse(Request.QueryString["ID"], out _presupuestoID) == false)
            || (int.Parse(Request.QueryString["ID"]) <= 0))
            return;

        _presupuestoID = int.Parse(Request.QueryString["ID"]);
        
        ONPresupuesto _presupuesto = ONPresupuesto.CrearDuplicado(ONPresupuesto.CrearPresupuesto(_presupuestoID));
        string _destino = "Presupuesto.aspx?ID=" + _presupuesto.ID.ToString();

        Response.Write("<script language='javascript'> window.open('" + _destino + "', '_blank');</script>");
        //Response.Write("<script language='javascript'> window.open('" + _destino + "', 'window','dependent=yes,HEIGHT=600,WIDTH=820,top=50,left=50,toolbar=yes,scrollbars=yes,resizable=yes');</script>");
        //Response.Redirect(_destino, "_blank", "menubar=yes");
        //Response.Write("<script>window.open('" + _destino + "','_blank');</script>");
        //Response.Redirect(_destino);
    }
    protected void CambiarEstado(object sender, EventArgs e)
    {
        string _estadoAnterior;
        System.Web.UI.WebControls.HiddenField _hf = (System.Web.UI.WebControls.HiddenField)fvPresupuesto.FindControl("hfEstado");

        _estadoAnterior = _hf.Value;
        string _nombreControl = ((ASPxButton)sender).ID;

        if (_nombreControl == "btnFinalizarBorrador")
            _hf.Value = ONPresupuesto.enuEstados.Presupuesto.ToString();
        else if (_nombreControl == "btnCerrar")
            _hf.Value = ONPresupuesto.enuEstados.Cerrado.ToString();
        else if (_nombreControl == "btnEnReparacion")
            _hf.Value = ONPresupuesto.enuEstados.Reparación.ToString();
        else if (_nombreControl == "btnFacturado")
            _hf.Value = ONPresupuesto.enuEstados.Facturado.ToString();
        else if (_nombreControl == "btnCancelar")
            _hf.Value = ONPresupuesto.enuEstados.Cancelado.ToString();
        else if (_nombreControl == "btnAnotado")
            _hf.Value = ONPresupuesto.enuEstados.Anotado.ToString();
        else if (_nombreControl == "btnCobrado")
            _hf.Value = ONPresupuesto.enuEstados.Cobrado.ToString();
        
        int _idPresupuesto = GuardarPresupuesto();

        //verifico si el estado anterior era "Presupuesto" o "Cerrado" y el estado nuevo es "Reparación", se debe crear una copia del presupuesto y ponerla con estado "Cerrado" y poner un enlace al presupuesto original(que seria la copia creada)
        if (((_estadoAnterior == ONPresupuesto.enuEstados.Presupuesto.ToString())
            || (_estadoAnterior == ONPresupuesto.enuEstados.Cerrado.ToString()))
            && (_hf.Value == ONPresupuesto.enuEstados.Reparación.ToString()))
        {
            ONPresupuesto _presupuesto = ONPresupuesto.CrearPresupuesto(_idPresupuesto);
            ONPresupuesto _presupuestoCopiado = ONPresupuesto.CrearDuplicadoCompleto(_presupuesto);

            //hago la asociación del presupuesto al original (que seria la copia, se hace asi por las fotos)
            _presupuesto = ONPresupuesto.CrearPresupuesto(_idPresupuesto); //lo tengo que volver a cargar x q al hacer el duplicado, lo pisa
            _presupuesto.PresupuestoOriginalId = _presupuestoCopiado.ID;
            _presupuesto.Actualizar();

            //busco los presupuestos que tengan la misma patente y la misma fecha de creación y los pongo en estado cerrado.
            ONPresupuestoColeccion _presupuestos = ONPresupuesto.ObtenerPor(_presupuesto.FechaHoraCreacion.Date.ToString(), _presupuesto.FechaHoraCreacion.Date.AddDays(1).AddSeconds(-1).ToString(), _presupuesto.Patente, "Todos");
            if (_presupuestos != null)
            {
                foreach (ONPresupuesto _presu in _presupuestos)
                {
                    //verifico que tenga la misma patente
                    if ((_presu.Patente == _presupuesto.Patente)
                        && (_presu.Aseguradora.ID == _presupuesto.Aseguradora.ID)
                        && (_presu.ID != _idPresupuesto))//que no sea el presupuesto que paso al estado Reparaciòn
                    {
                        _presu.Estado = ONPresupuesto.enuEstados.Cerrado.ToString();
                        _presu.Actualizar();
                    }
                }
            }
        }
        Response.Redirect("Presupuesto.aspx?ID=" + _idPresupuesto.ToString() + "&M=2");
    }
    /// <summary>
    /// Asigna el producto especificado al presupuesto.
    /// </summary>
    /// <param name="pIdProducto"></param>
    protected void AsignarProductoAPresupuesto(int pIdProducto)
    {
        //StockProducto _producto;
        //StockMovimientoStock _movimientoStock;
        //int _idMovimientoStock, _idPresupuesto;
        
        //_producto = StockProducto.CrearStockProducto(pIdProducto);// ((ASPxGridView)sender).GetRow(e.VisibleIndex) as StockProducto;

        ////Creo el movimiento de stock asociado
        //_movimientoStock = new StockMovimientoStock();
        //_idMovimientoStock = StockMovimientoStock.GenerarMovimientoDeStockConDiferencia("Asignado a presupuesto", "Responsable", -2, _producto.ID);

        ////obtengo el id del presupuesto del querystring
        //_idPresupuesto = int.Parse(Request.QueryString["ID"]);
            
        //StockProductoEnPresupuesto _productoEnPresupuesto = StockProductoEnPresupuesto.CrearStockProductoEnPresupuesto();
        //_productoEnPresupuesto.Cantidad = 2;
        //_productoEnPresupuesto.IdMovimientoDeStock = _idMovimientoStock;
        //_productoEnPresupuesto.IdPresupuesto = _idPresupuesto;
        //_productoEnPresupuesto.IdProducto = _producto.ID;
        //_productoEnPresupuesto.PrecioCosto = _producto.PrecioCosto;
        //_productoEnPresupuesto.PrecioVenta = _producto.PrecioVenta;
        //_productoEnPresupuesto.Responsable = "Usuario activo";
        //_productoEnPresupuesto.Insertar();

        //gvProductosAsociados.DataBind();
        
    }
    protected void lnkAsignar_Click(object sender, EventArgs e)
    {
        LinkButton btn = sender as LinkButton;

        GridViewDataItemTemplateContainer container = btn.NamingContainer as GridViewDataItemTemplateContainer;

        Object key = container.KeyValue;

        AsignarProductoAPresupuesto(int.Parse(key.ToString()));
        
    }
    protected void btnEstablecerProductoHaSidoEntregado_Click(object sender, ImageClickEventArgs e)
    {
        ImageButton _boton = sender as ImageButton;

        if (_boton.CommandArgument == "")
            return;

        int _idProductoEnPresupuesto = int.Parse(_boton.CommandArgument);
        SGT_ON.StockProductoEnPresupuesto _productoEnPresupuesto = SGT_ON.StockProductoEnPresupuesto.CrearStockProductoEnPresupuesto(_idProductoEnPresupuesto);

        if ((_productoEnPresupuesto == null)
            || (_productoEnPresupuesto.ID <= 0))
            return;

        if ((_productoEnPresupuesto.MovimientoAsociado == null)
            || (_productoEnPresupuesto.MovimientoAsociado.ID <= 0))
            return;

        _productoEnPresupuesto.MovimientoAsociado.ProductoEstaEnDeposito = false;
        _productoEnPresupuesto.MovimientoAsociado.Actualizar();

        gvProductosEnPresupuesto.DataBind();
        
    }
    protected void btnEstablecerProductoEstaEnDeposito_Click(object sender, ImageClickEventArgs e)
    {
        ImageButton _boton = sender as ImageButton;

        if (_boton.CommandArgument == "")
            return;

        int _idProductoEnPresupuesto = int.Parse(_boton.CommandArgument);
        SGT_ON.StockProductoEnPresupuesto _productoEnPresupuesto = SGT_ON.StockProductoEnPresupuesto.CrearStockProductoEnPresupuesto(_idProductoEnPresupuesto);

        if ((_productoEnPresupuesto == null)
            || (_productoEnPresupuesto.ID <= 0))
            return;

        if ((_productoEnPresupuesto.MovimientoAsociado == null)
            || (_productoEnPresupuesto.MovimientoAsociado.ID <= 0))
            return;

        _productoEnPresupuesto.MovimientoAsociado.ProductoEstaEnDeposito = true;
        _productoEnPresupuesto.MovimientoAsociado.Actualizar();
        //upProductosAsociados.Update();
        gvProductosEnPresupuesto.DataBind();
    }
    protected void dsAseguradoras_Selected(object sender, ObjectDataSourceStatusEventArgs e)
    {
        // Debo verificar si la aseguradora seleccionaad, aparece en el listado, si no, la tengo que agregar.
        int _IdPresupuesto = 0;
        //((CA2TarjetaColeccion)e.ReturnValue).Add(CA2Tarjeta.CrearTarjeta(0));
        if (Request.QueryString["ID"] != null)
        {
            int.TryParse(Request.QueryString["ID"].ToString(), out _IdPresupuesto);
            if (_IdPresupuesto > 0)
            {
                //obtengo la persona
                ONPresupuesto _presupuesto = ONPresupuesto.CrearPresupuesto(_IdPresupuesto);

                if ((_presupuesto == null) //si no es valida, salgo
                    || _presupuesto.ID <= 0)
                    return;

                //verifico en el listado obtenido si la empresa existe, si no esta, la agrego
                SGT_ON.AseguradoraColeccion _aseguradoras = e.ReturnValue as SGT_ON.AseguradoraColeccion;
                foreach (SGT_ON.Aseguradora _aseguradora in _aseguradoras)
                    if ((int.Parse(_aseguradora.ID.ToString())) == ((int)_presupuesto.AseguradoraId))
                        return;

                //si no la encontro en el listado, la agrego al final.
                ((AseguradoraColeccion)e.ReturnValue).Add(_presupuesto.Aseguradora);
            }
        }
    }
    protected void ExportarPresupuesto_Tick(object sender, EventArgs e)
    {
        ExportarPresupuesto.Enabled = false;

        DateTime? _fechaHoraultimoArchivoEnviado = (DateTime?)Session["UltimoArchivoEnviadoFechaHora"];
        if((_fechaHoraultimoArchivoEnviado.HasValue == false)
           || (_fechaHoraultimoArchivoEnviado.Value.AddSeconds(6) < DateTime.Now))
            VerificarSiHayQueExportarPresupuesto();
    }
    /// <summary>
    /// Valida si los campos han sido ingresados para exportar la OT
    /// </summary>
    /// <returns></returns>
    protected bool ValidarParaExportarOT()
    {   
        string _mensaje = "";

        #region Por compañia
        //Valido que se pueda exportar, condiciones:
        //Exportar OT: Si es por compañía (cualquier nombre en el campo aseguradora que no sea Particular) requerir el ingreso de:
        //a. nº de siniestro
        //b. inspector
        //c. importe autorizado
        //d. fecha de ingreso
        //e. fecha de egreso

        

        //tomo la aseguradora
        DropDownList _ddlAseguradoras = ((DropDownList)fvPresupuesto.FindControl("ddlAseguradoras"));
        if (_ddlAseguradoras.SelectedValue == ((int)-1).ToString())
        {//es -1, significa que es Particular
            //resultado = true;
        }
        else
        {// verifico que los datos requeridos, estén ingresados.
            System.Web.UI.WebControls.TextBox _NumeroDeSiniestroText = ((System.Web.UI.WebControls.TextBox)fvPresupuesto.FindControl("NumeroDeSiniestroText"));
            System.Web.UI.WebControls.TextBox _InspectorTextBox = ((System.Web.UI.WebControls.TextBox)fvPresupuesto.FindControl("InspectorTextBox"));
            System.Web.UI.WebControls.TextBox _TotalAutorizadoText = ((System.Web.UI.WebControls.TextBox)fvPresupuesto.FindControl("TotalAutorizadoText"));
            ASPxDateEdit _dtpfechaIngreso = ((ASPxDateEdit)fvPresupuesto.FindControl("dtpfechaIngreso"));
            ASPxDateEdit _ddlFechaEntregaEstimada = ((ASPxDateEdit)fvPresupuesto.FindControl("ddlFechaEntregaEstimada"));
            
            if ((_NumeroDeSiniestroText.Text == "")
                || (_InspectorTextBox.Text == "")
                || (_TotalAutorizadoText.Text == "")
                || (_dtpfechaIngreso.Text == "")
                || (_ddlFechaEntregaEstimada.Text == ""))
            {// si alguno de los valores no esta completado, muestro el error
                _mensaje = "número de siniestro, Inspector, Total autorizado, Fecha de ingreso, Fecha de egreso";
            }
        }
        #endregion

        #region Repuestos
        //Exportar OT: En caso de estar tildada la opción repuestos a proveer por la compañía:
        //requerir el ingreso del proveedor (repuestos) de repuestos y el número de remito o número de factura (Factura repuestos).
        System.Web.UI.WebControls.CheckBox _Repuestos = ((System.Web.UI.WebControls.CheckBox)fvPresupuesto.FindControl("RepuestosACargoDeLaCompaniaDeSegurosCheckBox"));
        System.Web.UI.WebControls.TextBox _ProveedorDeRepuestos = ((System.Web.UI.WebControls.TextBox)fvPresupuesto.FindControl("ProveedorDeRepuestosTextBox"));
        System.Web.UI.WebControls.TextBox _FacturaRepuestos = ((System.Web.UI.WebControls.TextBox)fvPresupuesto.FindControl("txtFacturaRepuestos"));
        
        if((_Repuestos.Checked == true) 
            && ((_ProveedorDeRepuestos.Text == "")
                || (_FacturaRepuestos.Text == "")))
        {
            if(_mensaje != "")
                _mensaje = _mensaje + ", " ;
            _mensaje = _mensaje + "Repuestos, Factura repuestos";
        }
        #endregion

        #region Repuestos particular
        //Exportar OT: Si es particular y el presupuesto tiene repuestos a remplazar: (cuando en el
        //campo compañía dice la palabra Particular) requerir el ingreso del proveedor de repuestos y el número de remito o factura
        if (_ddlAseguradoras.SelectedValue == ((int)-1).ToString())
        {//es particular
            ONPresupuesto _presupuesto = PresupuestoActivo;
            if ((_presupuesto != null)
                && (_presupuesto.ElementosAReemplazar.Count > 0)
                && ((_ProveedorDeRepuestos.Text == "")
                    || (_FacturaRepuestos.Text == "")))
            {
                if (_mensaje != "")
                    _mensaje = _mensaje + ", ";
                if(_mensaje.Contains("Repuestos, Factura repuestos") == false)//verifico que el mensaje no tenga el texto ya que es el mismo que en la validación anterior pero con diferentes condiciones.
                    _mensaje = _mensaje + "Repuestos, Factura repuestos";
            }
        }
        #endregion

        //Es obligatorio que tenga Feha de ingreso y egreso
        ASPxDateEdit _fecha = ((ASPxDateEdit)fvPresupuesto.FindControl("dtpfechaIngreso"));
        if (_fecha.Value == null)
        {
            if (_mensaje != "")
                _mensaje = _mensaje + ", ";
            _mensaje = _mensaje + "Fecha Ingreso";
        }

        _fecha = ((ASPxDateEdit)fvPresupuesto.FindControl("ddlFechaEntregaEstimada"));
        if (_fecha.Value == null)
        {
            if (_mensaje != "")
                _mensaje = _mensaje + ", ";
            _mensaje = _mensaje + "Fecha Entrega";
        }
        

        if (_mensaje != "")
        {
            MostrarMensaje("Debe ingresar " + _mensaje + " para poder continuar", System.Drawing.Color.Red);
            return false;
        }
        return true;

    }
    protected void btnGenerarReporte0_Load(object sender, EventArgs e)
    {
        if(VerificarSiElUsuarioPuedeImprimir == false)
        {
            ((ASPxButton)sender).Enabled = false;
            ((ASPxButton)sender).ToolTip = "Debe ser responsable del presupuesto o Administrador del sistema para poder exportar";
        }
        else
        {
            ((ASPxButton)sender).Enabled = true;
            ((ASPxButton)sender).ToolTip = "";
        }
    }
    private bool VerificarSiElUsuarioPuedeImprimir
    {
        get
        {
            ONEmpleado _usuarioActivo = EmpleadoActivo;
            ONPresupuesto _presupuestoActivo = PresupuestoActivo;

            // verifico que los dos existan
            if ((_usuarioActivo == null)
                || (_usuarioActivo.ID <= 0)
                || (_presupuestoActivo == null)
                || (_presupuestoActivo.ID <= 0))
                return false;

            //Verifico si el usuario activo es el responsable del presupuesto o el usuario activo pertenece al grupo de administradores.
            if((_presupuestoActivo.UsuarioResponsableId == _usuarioActivo.ID)
                || (ONEmpleado.UsuarioPerteneceARol(_usuarioActivo.UsuarioId, ONEmpleado.RolesDelSistema.Administración.ToString())))
                return true;

            return false;
        }
    }
}
